diff options
author | jasone <jasone@FreeBSD.org> | 2001-06-27 11:41:15 +0000 |
---|---|---|
committer | jasone <jasone@FreeBSD.org> | 2001-06-27 11:41:15 +0000 |
commit | 22f14eaadfe2f54e3d94f9a549dbb55a301222e1 (patch) | |
tree | 463b1f41916ef7a7abac0e3d8230ce498dcde63c /lib/libpthread/thread/thr_find_thread.c | |
parent | 97220dbd1ea90cd0e4fbc824e176960ac2efe949 (diff) | |
download | FreeBSD-src-22f14eaadfe2f54e3d94f9a549dbb55a301222e1.zip FreeBSD-src-22f14eaadfe2f54e3d94f9a549dbb55a301222e1.tar.gz |
Fix a race condition in pthread_join(). All of the following must occur
atomically:
1) Search _thread_list for the thread to join.
2) Search _dead_list for the thread to join.
3) Set the running thread as the joiner.
While we're at it, fix a race in the case where multiple threads try to
join on the same thread. POSIX says that the behavior of multiple joiners
is undefined, but the fix is cheap as a result of the other fix.
Diffstat (limited to 'lib/libpthread/thread/thr_find_thread.c')
-rw-r--r-- | lib/libpthread/thread/thr_find_thread.c | 32 |
1 files changed, 0 insertions, 32 deletions
diff --git a/lib/libpthread/thread/thr_find_thread.c b/lib/libpthread/thread/thr_find_thread.c index 861c4cb..e6e9294 100644 --- a/lib/libpthread/thread/thr_find_thread.c +++ b/lib/libpthread/thread/thr_find_thread.c @@ -64,35 +64,3 @@ _find_thread(pthread_t pthread) /* Return zero if the thread exists: */ return ((pthread1 != NULL) ? 0:ESRCH); } - -/* Find a thread in the linked list of dead threads: */ -int -_find_dead_thread(pthread_t pthread) -{ - pthread_t pthread1; - - /* Check if the caller has specified an invalid thread: */ - if (pthread == NULL || pthread->magic != PTHREAD_MAGIC) - /* Invalid thread: */ - return(EINVAL); - - /* - * Lock the garbage collector mutex to ensure that the garbage - * collector is not using the dead thread list. - */ - if (pthread_mutex_lock(&_gc_mutex) != 0) - PANIC("Cannot lock gc mutex"); - - /* Search for the specified thread: */ - TAILQ_FOREACH(pthread1, &_dead_list, dle) { - if (pthread1 == pthread) - break; - } - - /* Unlock the garbage collector mutex: */ - if (pthread_mutex_unlock(&_gc_mutex) != 0) - PANIC("Cannot lock gc mutex"); - - /* Return zero if the thread exists: */ - return ((pthread1 != NULL) ? 0:ESRCH); -} |