summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread/thr_find_thread.c
diff options
context:
space:
mode:
authorjasone <jasone@FreeBSD.org>2001-06-27 11:41:15 +0000
committerjasone <jasone@FreeBSD.org>2001-06-27 11:41:15 +0000
commit22f14eaadfe2f54e3d94f9a549dbb55a301222e1 (patch)
tree463b1f41916ef7a7abac0e3d8230ce498dcde63c /lib/libpthread/thread/thr_find_thread.c
parent97220dbd1ea90cd0e4fbc824e176960ac2efe949 (diff)
downloadFreeBSD-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.c32
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);
-}
OpenPOWER on IntegriCloud