summaryrefslogtreecommitdiffstats
path: root/lib/libthr/thread/thr_clean.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libthr/thread/thr_clean.c')
-rw-r--r--lib/libthr/thread/thr_clean.c12
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);
}
}
-
OpenPOWER on IntegriCloud