diff options
Diffstat (limited to 'lib/libthr/thread/thr_clean.c')
-rw-r--r-- | lib/libthr/thread/thr_clean.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/libthr/thread/thr_clean.c b/lib/libthr/thread/thr_clean.c index cc6f34f..33fec2e 100644 --- a/lib/libthr/thread/thr_clean.c +++ b/lib/libthr/thread/thr_clean.c @@ -31,10 +31,12 @@ * * $FreeBSD$ */ + #include <signal.h> #include <errno.h> #include <stdlib.h> #include <pthread.h> + #include "thr_private.h" __weak_reference(_pthread_cleanup_push, pthread_cleanup_push); @@ -43,11 +45,14 @@ __weak_reference(_pthread_cleanup_pop, pthread_cleanup_pop); void _pthread_cleanup_push(void (*routine) (void *), void *routine_arg) { + struct pthread *curthread = _get_curthread(); struct pthread_cleanup *new; - if ((new = (struct pthread_cleanup *) malloc(sizeof(struct pthread_cleanup))) != NULL) { + if ((new = (struct pthread_cleanup *) + malloc(sizeof(struct pthread_cleanup))) != NULL) { new->routine = routine; new->routine_arg = routine_arg; + new->onstack = 0; new->next = curthread->cleanup; curthread->cleanup = new; @@ -57,6 +62,7 @@ _pthread_cleanup_push(void (*routine) (void *), void *routine_arg) void _pthread_cleanup_pop(int execute) { + struct pthread *curthread = _get_curthread(); struct pthread_cleanup *old; if ((old = curthread->cleanup) != NULL) { @@ -64,7 +70,7 @@ _pthread_cleanup_pop(int execute) if (execute) { old->routine(old->routine_arg); } - free(old); + if (old->onstack == 0) + free(old); } } - |