void pthread_exit(void *retval) { pthread_t self_id = pthread_self(); if (self_id == 0) { DEBUG("ERROR called pthread_self() returned 0 in \"%s\"!\n", __func__); } else { pthread_thread_t *self = pthread_sched_threads[self_id - 1]; while (self->cleanup_top) { __pthread_cleanup_datum_t *ct = self->cleanup_top; self->cleanup_top = ct->__next; ct->__routine(ct->__arg); } /* Prevent linking in pthread_tls.o if no TSS functions were used. */ extern void __pthread_keys_exit(int self_id) __attribute__((weak)); if (__pthread_keys_exit) { __pthread_keys_exit(self_id); } self->thread_pid = KERNEL_PID_UNDEF; DEBUG("pthread_exit(%p), self == %p\n", retval, (void *) self); if (self->status != PTS_DETACHED) { self->returnval = retval; self->status = PTS_ZOMBIE; if (self->joining_thread) { /* our thread got an other thread waiting for us */ thread_wakeup(self->joining_thread); } } dINT(); if (self->stack) { msg_t m; m.content.ptr = self->stack; msg_send_int(&m, pthread_reaper_pid); } } sched_task_exit(); }
void pthread_exit(void *retval) { pthread_t self_id = pthread_self(); if (self_id == 0) { DEBUG("ERROR called pthread_self() returned 0 in \"%s\"!\n", __func__); } else { pthread_thread_t *self = pthread_sched_threads[self_id-1]; while (self->cleanup_top) { __pthread_cleanup_datum_t *ct = self->cleanup_top; self->cleanup_top = ct->__next; ct->__routine(ct->__arg); } self->thread_pid = KERNEL_PID_NULL; DEBUG("pthread_exit(%p), self == %p\n", retval, (void *) self); if (self->status != PTS_DETACHED) { self->returnval = retval; self->status = PTS_ZOMBIE; if (self->joining_thread) { /* our thread got an other thread waiting for us */ thread_wakeup(self->joining_thread); } } dINT(); if (self->stack) { msg_t m; m.content.ptr = self->stack; msg_send_int(&m, pthread_reaper_pid); } } sched_task_exit(); }