list_add (&self->header.data.list, &__stack_user);
list_add (&self->list, &__stack_user);
__reclaim_stacks (void){  struct pthread *self = (struct pthread *) THREAD_SELF;  /* No locking necessary.  The caller is the only stack in use.  */  /* Mark all stacks except the still running one as free.  */  list_t *runp;  list_for_each (runp, &stack_used)    {      struct pthread *curp;      curp = list_entry (runp, struct pthread, header.data.list);      if (curp != self)	{	  /* This marks the stack as free.  */	  curp->tid = 0;	  /* Account for the size of the stack.  */	  stack_cache_actsize += curp->stackblock_size;	}    }  /* Add the stack of all running threads to the cache.  */  list_splice (&stack_used, &stack_cache);  /* Remove the entry for the current thread to from the cache list     and add it to the list of running threads.  Which of the two     lists is decided by the user_stack flag.  */  list_del (&self->header.data.list);  /* Re-initialize the lists for all the threads.  */  INIT_LIST_HEAD (&stack_used);  INIT_LIST_HEAD (&__stack_user);  if (__builtin_expect (THREAD_GETMEM (self, user_stack), 0))    list_add (&self->header.data.list, &__stack_user);  else    list_add (&self->header.data.list, &stack_used);  /* There is one thread running.  */  __nptl_nthreads = 1;  /* Initialize the lock.  */  stack_cache_lock = LLL_LOCK_INITIALIZER;}