diff --git a/docs/latex/wx/thread.tex b/docs/latex/wx/thread.tex index 1559443b69..d523d58496 100644 --- a/docs/latex/wx/thread.tex +++ b/docs/latex/wx/thread.tex @@ -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} diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 86c4088834..14e588268a 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -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 )