summaryrefslogtreecommitdiff
path: root/lib/libthr/thread/thr_detach.c
diff options
context:
space:
mode:
authorMike Makonnen <mtm@FreeBSD.org>2004-05-20 12:06:16 +0000
committerMike Makonnen <mtm@FreeBSD.org>2004-05-20 12:06:16 +0000
commit4cd18a22d554e7205ddf0408badbda02411ed51e (patch)
tree191973c93de49160bb4144ea98ee350f5906d883 /lib/libthr/thread/thr_detach.c
parent3ef392f38b3dfe29567e295d07ec36e8d34056a8 (diff)
Notes
Diffstat (limited to 'lib/libthr/thread/thr_detach.c')
-rw-r--r--lib/libthr/thread/thr_detach.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/libthr/thread/thr_detach.c b/lib/libthr/thread/thr_detach.c
index 7d87d05c6502..1d7d3342c4ba 100644
--- a/lib/libthr/thread/thr_detach.c
+++ b/lib/libthr/thread/thr_detach.c
@@ -41,14 +41,21 @@ __weak_reference(_pthread_detach, pthread_detach);
int
_pthread_detach(pthread_t pthread)
{
+ int error;
+
if (pthread->magic != PTHREAD_MAGIC)
return (EINVAL);
- UMTX_LOCK(&pthread->lock);
+ PTHREAD_LOCK(pthread);
if ((pthread->attr.flags & PTHREAD_DETACHED) != 0) {
- UMTX_UNLOCK(&pthread->lock);
- return ((pthread->state == PS_DEAD) ? ESRCH : EINVAL);
+ _thread_sigblock();
+ DEAD_LIST_LOCK;
+ error = pthread->isdead ? ESRCH : EINVAL;
+ DEAD_LIST_UNLOCK;
+ _thread_sigunblock();
+ PTHREAD_UNLOCK(pthread);
+ return (error);
}
pthread->attr.flags |= PTHREAD_DETACHED;
@@ -56,10 +63,6 @@ _pthread_detach(pthread_t pthread)
/* Check if there is a joiner: */
if (pthread->joiner != NULL) {
struct pthread *joiner = pthread->joiner;
- _thread_critical_enter(joiner);
-
- /* Make the thread runnable: */
- PTHREAD_NEW_STATE(joiner, PS_RUNNING);
/* Set the return value for the woken thread: */
joiner->join_status.error = ESRCH;
@@ -70,10 +73,10 @@ _pthread_detach(pthread_t pthread)
* Disconnect the joiner from the thread being detached:
*/
pthread->joiner = NULL;
- _thread_critical_exit(joiner);
+ PTHREAD_WAKE(joiner);
}
- UMTX_UNLOCK(&pthread->lock);
+ PTHREAD_UNLOCK(pthread);
return (0);
}