Thanks David, changes look sound, now merged and submitted to svn/trunk.
On Fri, Oct 16, 2009 at 1:31 PM, David Fries <[email protected]> wrote: > This was against 2.8.1, but I see the trunk is identical. > Any issues with using PTHREAD_STACK_MIN? > http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getstacksize.html > > > I was trying to create a lot of threads under 32 bit Linux, but could > only create 376, then the program would hang. > 376 * 8MB stack per thread = 3008 MB > The stack size allocated per thread blew the process address stack. > To get more threads you have to specify a smaller per thread stack, > but while the Thread::start says it will limit the stack size to the > smallest allowable stack size, it won't let it be smaller than the > default. I included the limits.h header to use PTHREAD_STACK_MIN as > the minimum stack size. > > As for the deadlock, if the pthread_create failed, the new thread > doesn't exist and doesn't call threadStartedBlock.release(), so the > existing thread deadlocks on threadStartedBlock.block(). Only block > if the thread was started. > > -- > David Fries <[email protected]> > http://fries.net/~david/ (PGP encryption key available) > > > Index: src/OpenThreads/pthreads/PThread.c++ > =================================================================== > --- src/OpenThreads/pthreads/PThread.c++ (revision 10273) > +++ src/OpenThreads/pthreads/PThread.c++ (working copy) > @@ -21,6 +21,7 @@ > #include <sys/types.h> > #include <unistd.h> > #include <pthread.h> > +#include <limits.h> > > #if defined __linux || defined __sun || defined __APPLE__ > #include <string.h> > @@ -588,30 +589,29 @@ > > PThreadPrivateData *pd = static_cast<PThreadPrivateData *> (_prvData); > > - size_t defaultStackSize; > - pthread_attr_getstacksize( &thread_attr, &defaultStackSize); > - if(status != 0) { > - return status; > + > //------------------------------------------------------------------------- > + // Set the stack size if requested, but not less than a platform > reasonable > + // value. > + // > + if(pd->stackSize) { > + if(pd->stackSize < PTHREAD_STACK_MIN) > + pd->stackSize = PTHREAD_STACK_MIN; > + pthread_attr_setstacksize( &thread_attr, pd->stackSize); > + if(status != 0) { > + return status; > + } > } > > - if(defaultStackSize < pd->stackSize) { > - > - pthread_attr_setstacksize( &thread_attr, pd->stackSize); > - if(status != 0) { > - return status; > - } > - } > - > > //------------------------------------------------------------------------- > // Now get what we actually have... > // > - pthread_attr_getstacksize( &thread_attr, &defaultStackSize); > + size_t size; > + pthread_attr_getstacksize( &thread_attr, &size); > if(status != 0) { > return status; > } > + pd->stackSize = size; > > - pd->stackSize = defaultStackSize; > - > > //------------------------------------------------------------------------- > // Prohibit the stack size from being changed. > // > @@ -635,18 +635,15 @@ > status = pthread_create(&(pd->tid), &thread_attr, > ThreadPrivateActions::StartThread, > static_cast<void *>(this)); > - > - // wait till the thread has actually started. > - pd->threadStartedBlock.block(); > > - if(status != 0) { > - return status; > + if(status == 0) { > + // wait till the thread has actually started. > + pd->threadStartedBlock.block(); > + > + pd->idSet = true; > } > > - pd->idSet = true; > - > - return 0; > - > + return status; > } > > //----------------------------------------------------------------------------- > > _______________________________________________ > osg-users mailing list > [email protected] > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > _______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

