From 363ab5c5662f36c68f5120d8974cbc31004815b0 Mon Sep 17 00:00:00 2001 From: davidxu Date: Sun, 30 Oct 2005 23:59:01 +0000 Subject: Add thread exit handler in timer_loop to handle broken buggy code which could lead to memory leak. --- lib/libthr/thread/thr_timer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/libthr/thread/thr_timer.c') diff --git a/lib/libthr/thread/thr_timer.c b/lib/libthr/thread/thr_timer.c index fa3b893..c3f5ed5 100644 --- a/lib/libthr/thread/thr_timer.c +++ b/lib/libthr/thread/thr_timer.c @@ -107,7 +107,7 @@ __timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid) SIGEMPTYSET(set); SIGADDSET(set, tmr->signo); __sys_sigprocmask(SIG_BLOCK, &set, &oset); - ret = pthread_create(&newtd, &attr, timer_loop, tmr); + ret = _pthread_create(&newtd, &attr, timer_loop, tmr); __sys_sigprocmask(SIG_SETMASK, &oset, NULL); pthread_attr_destroy(&attr); if (__predict_false(ret != 0)) { @@ -152,6 +152,7 @@ timer_loop(void *arg) siginfo_t si; sigset_t set; + THR_CLEANUP_PUSH(curthread, free, tmr); THR_UMTX_LOCK(curthread, &tmr->lock); THR_UMTX_UNLOCK(curthread, &tmr->lock); SIGEMPTYSET(set); @@ -163,6 +164,7 @@ timer_loop(void *arg) tmr->function(&tmr->value); } } + THR_CLEANUP_POP(curthread, 0); free(tmr); return (0); } -- cgit v1.1