diff options
author | Daniel Eischen <deischen@FreeBSD.org> | 2002-03-06 19:28:41 +0000 |
---|---|---|
committer | Daniel Eischen <deischen@FreeBSD.org> | 2002-03-06 19:28:41 +0000 |
commit | ca4b2c1a792312ff074618844ffd77232cdee86c (patch) | |
tree | f340718e38ac9a4f173cf51ddb7eedc39288a0fd | |
parent | a370851f6e65f41287609adc39e39b4e42a4b4d9 (diff) | |
download | src-ca4b2c1a792312ff074618844ffd77232cdee86c.tar.gz src-ca4b2c1a792312ff074618844ffd77232cdee86c.zip |
Properly clear the status of a join operation if the joining thread is
canceled or the joinee is detached.
Notes
Notes:
svn path=/head/; revision=91762
-rw-r--r-- | lib/libc_r/uthread/uthread_cancel.c | 1 | ||||
-rw-r--r-- | lib/libc_r/uthread/uthread_detach.c | 4 | ||||
-rw-r--r-- | lib/libkse/thread/thr_cancel.c | 1 | ||||
-rw-r--r-- | lib/libkse/thread/thr_detach.c | 4 | ||||
-rw-r--r-- | lib/libpthread/thread/thr_cancel.c | 1 | ||||
-rw-r--r-- | lib/libpthread/thread/thr_detach.c | 4 |
6 files changed, 12 insertions, 3 deletions
diff --git a/lib/libc_r/uthread/uthread_cancel.c b/lib/libc_r/uthread/uthread_cancel.c index 4c6ca98b0d1d..cf72d89e908b 100644 --- a/lib/libc_r/uthread/uthread_cancel.c +++ b/lib/libc_r/uthread/uthread_cancel.c @@ -70,6 +70,7 @@ _pthread_cancel(pthread_t pthread) if (pthread->join_status.thread != NULL) { pthread->join_status.thread->joiner = NULL; + pthread->join_status.thread = NULL; } pthread->cancelflags |= PTHREAD_CANCELLING; PTHREAD_NEW_STATE(pthread, PS_RUNNING); diff --git a/lib/libc_r/uthread/uthread_detach.c b/lib/libc_r/uthread/uthread_detach.c index b0e6fc446a58..298fdb41b0db 100644 --- a/lib/libc_r/uthread/uthread_detach.c +++ b/lib/libc_r/uthread/uthread_detach.c @@ -66,7 +66,9 @@ _pthread_detach(pthread_t pthread) PTHREAD_NEW_STATE(joiner, PS_RUNNING); /* Set the return value for the woken thread: */ - joiner->error = ESRCH; + joiner->join_status.error = ESRCH; + joiner->join_status.ret = NULL; + joiner->join_status.thread = NULL; /* * Disconnect the joiner from the thread being detached: diff --git a/lib/libkse/thread/thr_cancel.c b/lib/libkse/thread/thr_cancel.c index 4c6ca98b0d1d..cf72d89e908b 100644 --- a/lib/libkse/thread/thr_cancel.c +++ b/lib/libkse/thread/thr_cancel.c @@ -70,6 +70,7 @@ _pthread_cancel(pthread_t pthread) if (pthread->join_status.thread != NULL) { pthread->join_status.thread->joiner = NULL; + pthread->join_status.thread = NULL; } pthread->cancelflags |= PTHREAD_CANCELLING; PTHREAD_NEW_STATE(pthread, PS_RUNNING); diff --git a/lib/libkse/thread/thr_detach.c b/lib/libkse/thread/thr_detach.c index b0e6fc446a58..298fdb41b0db 100644 --- a/lib/libkse/thread/thr_detach.c +++ b/lib/libkse/thread/thr_detach.c @@ -66,7 +66,9 @@ _pthread_detach(pthread_t pthread) PTHREAD_NEW_STATE(joiner, PS_RUNNING); /* Set the return value for the woken thread: */ - joiner->error = ESRCH; + joiner->join_status.error = ESRCH; + joiner->join_status.ret = NULL; + joiner->join_status.thread = NULL; /* * Disconnect the joiner from the thread being detached: diff --git a/lib/libpthread/thread/thr_cancel.c b/lib/libpthread/thread/thr_cancel.c index 4c6ca98b0d1d..cf72d89e908b 100644 --- a/lib/libpthread/thread/thr_cancel.c +++ b/lib/libpthread/thread/thr_cancel.c @@ -70,6 +70,7 @@ _pthread_cancel(pthread_t pthread) if (pthread->join_status.thread != NULL) { pthread->join_status.thread->joiner = NULL; + pthread->join_status.thread = NULL; } pthread->cancelflags |= PTHREAD_CANCELLING; PTHREAD_NEW_STATE(pthread, PS_RUNNING); diff --git a/lib/libpthread/thread/thr_detach.c b/lib/libpthread/thread/thr_detach.c index b0e6fc446a58..298fdb41b0db 100644 --- a/lib/libpthread/thread/thr_detach.c +++ b/lib/libpthread/thread/thr_detach.c @@ -66,7 +66,9 @@ _pthread_detach(pthread_t pthread) PTHREAD_NEW_STATE(joiner, PS_RUNNING); /* Set the return value for the woken thread: */ - joiner->error = ESRCH; + joiner->join_status.error = ESRCH; + joiner->join_status.ret = NULL; + joiner->join_status.thread = NULL; /* * Disconnect the joiner from the thread being detached: |