On Tue, Dec 01, 2020 at 08:00:18PM +0100, Otto Moerbeek wrote:

> On Tue, Dec 01, 2020 at 10:13:29AM -0800, [email protected] wrote:
> 
> > On Tue, 1 Dec 2020, Sebastien Marie wrote:
> > > I have a random segfault while using threads with custom stack.
> > > 
> > > In short, I am doing:
> > > - allocate a stack space for the thread
> > > - create a thread (with custom stack using pthread_attr_setstack())
> > > - join the thread
> > > - free the allocated stack
> > > - create a new thread, etc...
> > > 
> > > If I remove the fact to free the allocate stack once done, it seems
> > > fine (but reach ENOMEM after a while).
> > > 
> > > I am suspecting some state corruption or stack reuse, but I can't find
> > > where for now. Or am I doing bad thing and I shouldn't deallocate the
> > > stack at his place ?
> > 
> > You should not deallocate the stack.  To quote POSIX, XSI 2.9.8:
> > 
> > 
> > 2.9.8  Use of Application-Managed Thread Stacks
> > 
> >        An "application-managed thread stack" is a region of memory 
> > allocated by the application--or
> >        example, memory returned by the malloc() or mmap() functions--and 
> > designated as a stack
> >        through the act of passing the address and size of the stack, 
> > respectively, as the stackaddr and
> >        stacksize arguments to pthread_attr_setstack(). Application-managed 
> > stacks allow the application
> >        to precisely control the placement and size of a stack.
> > 
> >        The application grants to the implementation permanent ownership of 
> > and control over the
> >        application-managed stack when the attributes object in which the 
> > stack or stackaddr attribute has
> >        been set is used, either by presenting that attribute's object as 
> > the attr argument in a call to
> >        pthread_create() that completes successfully, or by storing a 
> > pointer to the attributes object in the
> >        sigev_notify_attributes member of a struct sigevent and passing that 
> > struct sigevent to a function
> >        accepting such argument that completes successfully. The application 
> > may thereafter utilize the
> >        memory within the stack only within the normal context of stack 
> > usage within or properly
> >        synchronized with a thread that has been scheduled by the 
> > implementation with stack pointer
> >        value(s) that are within the range of that stack. In particular, the 
> > region of memory cannot be
> >        freed, nor can it be later specified as the stack for another thread.
> > 
> > 
> > Note that last sentence.
> > 
> > 
> > Philip Guenther
> > 
> 
> The man page is lacking or even wrong in this respect. It explicitly
> talks about how to do deallocation.

And curiously, if I use 4*PTHREAD_STACK_MIN for both the mmap size arg
and the pthread_attr_setstack size arg, the crash does not appear.

        -Otto

Reply via email to