]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied [ 1186782 ] Setting thread stack size on Unix.
authorStefan Neis <Stefan.Neis@t-online.de>
Sun, 25 Sep 2005 16:12:18 +0000 (16:12 +0000)
committerStefan Neis <Stefan.Neis@t-online.de>
Sun, 25 Sep 2005 16:12:18 +0000 (16:12 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35682 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/thread.tex
src/unix/threadpsx.cpp

index 1559443b695d7ab865b5db72da3da6bafb7b8192..d523d58496cf1f05d1dbdd16e98826d884d293ac 100644 (file)
@@ -84,7 +84,22 @@ stack.
 Creates a new thread. The thread object is created in the suspended state, and you
 should call \helpref{Run}{wxthreadrun} to start running it.  You may optionally
 specify the stack size to be allocated to it (Ignored on platforms that don't
-support setting it explicitly, eg. Unix).
+support setting it explicitly, eg. Unices without pthread_attr_setstacksize).
+If you do not specify the stack size, the system's default value is used.
+
+{\bf Warning:} It is a good idea to explicitly specify a value as systems'
+default values vary from just a couple of kByte on some systems (BSD and
+OS/2 systems) to one or several MByte (Windows, Solaris, Linux). So, if you
+have a thread that requires more than just a few kBytes of memory, you will
+have mysterious problems on some platforms but not on the common ones. OTOH
+just indicating a large stack size by default will give you performance
+issues on those systems with small default stack since those typically use
+fully committed memory for the stack.
+If, on the other hand you use lots of threads (say several hundred, which
+often indicates a design flaw), virtual adress space can get tight unless
+you explicitly specify a smaller amount of thread stack space for each
+thread.
+
 
 \wxheading{Return value}
 
index 86c408883416898b0d5d4d448ce2576870e8b481..14e588268ab0aec5930565eb9cf6698642395e35 100644 (file)
@@ -1058,7 +1058,13 @@ wxThread::wxThread(wxThreadKind kind)
     m_isDetached = kind == wxTHREAD_DETACHED;
 }
 
-wxThreadError wxThread::Create(unsigned int WXUNUSED(stackSize))
+#ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE
+    #define WXUNUSED_STACKSIZE(identifier)  identifier
+#else
+    #define WXUNUSED_STACKSIZE(identifier)  WXUNUSED(identifier)
+#endif
+
+wxThreadError wxThread::Create(unsigned int WXUNUSED_STACKSIZE(stackSize))
 {
     if ( m_internal->GetState() != STATE_NEW )
     {
@@ -1070,6 +1076,11 @@ wxThreadError wxThread::Create(unsigned int WXUNUSED(stackSize))
     pthread_attr_t attr;
     pthread_attr_init(&attr);
 
+#ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE
+    if (stackSize)
+      pthread_attr_setstacksize(&attr, stackSize);
+#endif
+
 #ifdef HAVE_THREAD_PRIORITY_FUNCTIONS
     int policy;
     if ( pthread_attr_getschedpolicy(&attr, &policy) != 0 )