summaryrefslogtreecommitdiff
path: root/exit.c
diff options
context:
space:
mode:
Diffstat (limited to 'exit.c')
-rw-r--r--exit.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/exit.c b/exit.c
index 0778fc2..a9c352c 100644
--- a/exit.c
+++ b/exit.c
@@ -12,25 +12,30 @@
#include "implement.h"
void
-pthread_exit(void * value)
+_pthread_vacuum(void)
{
- int t;
-
- t = _pthread_getthreadindex(pthread_self());
+ /* This function can be called from pthread_exit(), or from
+ _pthread_start_call() in which case cleanupstack should be
+ empty but destructorstack still needs to be run. */
+ _pthread_threads_thread_t * this;
- /* Run all the cleanup handlers */
- _pthread_do_cancellation(t);
+ this = *_PTHREAD_THIS;
- /* CRITICAL SECTION */
- pthread_mutex_lock(&_pthread_count_mutex);
+ /* Run all the handlers. */
+ _pthread_handler_pop_all(&(this->cleanupstack), _PTHREAD_HANDLER_EXECUTE);
+ _pthread_handler_pop_all(&(this->destructorstack), _PTHREAD_HANDLER_EXECUTE);
- /* Frees attr and cleanupstack */
- free(_pthread_threads_table[t]->attr);
+ /* Pop any atfork handlers to free storage. */
+ _pthread_handler_pop_all(&(this->forkprepare), _PTHREAD_HANDLER_NOEXECUTE);
+ _pthread_handler_pop_all(&(this->forkparent), _PTHREAD_HANDLER_NOEXECUTE);
+ _pthread_handler_pop_all(&(this->forkchild), _PTHREAD_HANDLER_NOEXECUTE);
- _pthread_threads_table[t]->thread = NULL;
-
- pthread_mutex_unlock(&_pthread_count_mutex);
- /* END CRITICAL SECTION */
+ _pthread_delete_thread_entry(NULL);
+}
+void
+pthread_exit(void * value)
+{
+ _pthread_vacuum();
_endthreadex((DWORD) value);
}