aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Makonnen <mtm@FreeBSD.org>2004-10-13 11:42:20 +0000
committerMike Makonnen <mtm@FreeBSD.org>2004-10-13 11:42:20 +0000
commit5dbd7addb0c95cbb67b871228385fa90ca7a9ab4 (patch)
tree8483c07b545b86140bcdf0b51159f6be244af2bc /lib
parent43b42e0a71cc2e78d2cc84ed70e7395257c42b81 (diff)
Notes
Diffstat (limited to 'lib')
-rw-r--r--lib/libthr/thread/thr_exit.c3
-rw-r--r--lib/libthr/thread/thr_join.c11
2 files changed, 10 insertions, 4 deletions
diff --git a/lib/libthr/thread/thr_exit.c b/lib/libthr/thread/thr_exit.c
index 6a4568788f325..f74b5e187775e 100644
--- a/lib/libthr/thread/thr_exit.c
+++ b/lib/libthr/thread/thr_exit.c
@@ -195,7 +195,8 @@ deadlist_free_threads()
TAILQ_FOREACH_SAFE(ptd, &_dead_list, dle, ptdTemp) {
/* Don't destroy the initial thread or non-detached threads. */
if (ptd == _thread_initial ||
- (ptd->attr.flags & PTHREAD_DETACHED) == 0)
+ (ptd->attr.flags & PTHREAD_DETACHED) == 0 ||
+ !ptd->isdead)
continue;
TAILQ_REMOVE(&_dead_list, ptd, dle);
deadlist_free_onethread(ptd);
diff --git a/lib/libthr/thread/thr_join.c b/lib/libthr/thread/thr_join.c
index 8ff4c1a1c2490..29dd421fa8968 100644
--- a/lib/libthr/thread/thr_join.c
+++ b/lib/libthr/thread/thr_join.c
@@ -41,7 +41,7 @@ __weak_reference(_pthread_join, pthread_join);
int
_pthread_join(pthread_t pthread, void **thread_return)
{
- int ret = 0;
+ int ret, dead;
pthread_t thread;
/* Check if the caller has specified an invalid thread: */
@@ -60,6 +60,9 @@ _pthread_join(pthread_t pthread, void **thread_return)
* the searches in _thread_list and _dead_list (as well as setting up
* join/detach state) have to be done atomically.
*/
+ ret = 0;
+ dead = 0;
+ thread = NULL;
_thread_sigblock();
DEAD_LIST_LOCK;
THREAD_LIST_LOCK;
@@ -70,10 +73,12 @@ _pthread_join(pthread_t pthread, void **thread_return)
break;
}
}
- } else {
+ }
+ if (thread == NULL) {
TAILQ_FOREACH(thread, &_dead_list, dle) {
if (thread == pthread) {
PTHREAD_LOCK(pthread);
+ dead = 1;
break;
}
}
@@ -109,7 +114,7 @@ _pthread_join(pthread_t pthread, void **thread_return)
}
/* Check if the thread is not dead: */
- if (!pthread->isdead) {
+ if (!dead) {
/* Set the running thread to be the joiner: */
pthread->joiner = curthread;
PTHREAD_UNLOCK(pthread);