pthread_exit(outcome);
__pthread_do_exit(outcome, CURRENT_STACK_FRAME);
static int pthread_start_thread(void *arg){  pthread_descr self = (pthread_descr) arg;  struct pthread_request request;  void * outcome;  /* Initialize special thread_self processing, if any.  */#ifdef INIT_THREAD_SELF  INIT_THREAD_SELF(self, self->p_nr);#endif  /* Make sure our pid field is initialized, just in case we get there     before our father has initialized it. */  THREAD_SETMEM(self, p_pid, __getpid());  /* Initial signal mask is that of the creating thread. (Otherwise,     we'd just inherit the mask of the thread manager.) */  sigprocmask(SIG_SETMASK, &self->p_start_args.mask, NULL);  /* Set the scheduling policy and priority for the new thread, if needed */  if (THREAD_GETMEM(self, p_start_args.schedpolicy) >= 0)    /* Explicit scheduling attributes were provided: apply them */    __sched_setscheduler(THREAD_GETMEM(self, p_pid),			 THREAD_GETMEM(self, p_start_args.schedpolicy),                         &self->p_start_args.schedparam);  else if (__pthread_manager_thread.p_priority > 0)    /* Default scheduling required, but thread manager runs in realtime       scheduling: switch new thread to SCHED_OTHER policy */    {      struct sched_param default_params;      default_params.sched_priority = 0;      __sched_setscheduler(THREAD_GETMEM(self, p_pid),                           SCHED_OTHER, &default_params);    }  /* Make gdb aware of new thread */  if (__pthread_threads_debug && __pthread_sig_debug > 0) {    request.req_thread = self;    request.req_kind = REQ_DEBUG;    __libc_write(__pthread_manager_request,                 (char *) &request, sizeof(request));    suspend(self);  }  /* Run the thread code */  outcome = self->p_start_args.start_routine(THREAD_GETMEM(self,							   p_start_args.arg));  /* Exit with the given return value */  pthread_exit(outcome);  return 0;}