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

Reply via email to