summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread/thr_cancel.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libpthread/thread/thr_cancel.c')
-rw-r--r--lib/libpthread/thread/thr_cancel.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/libpthread/thread/thr_cancel.c b/lib/libpthread/thread/thr_cancel.c
index 2af3db6..7f40e36 100644
--- a/lib/libpthread/thread/thr_cancel.c
+++ b/lib/libpthread/thread/thr_cancel.c
@@ -64,9 +64,23 @@ _pthread_cancel(pthread_t pthread)
break;
case PS_JOIN:
+ /*
+ * Disconnect the thread from the joinee and
+ * detach:
+ */
+ if (pthread->data.thread != NULL) {
+ pthread->data.thread->joiner = NULL;
+ pthread_detach((pthread_t)
+ pthread->data.thread);
+ }
+ pthread->cancelflags |= PTHREAD_CANCELLING;
+ PTHREAD_NEW_STATE(pthread, PS_RUNNING);
+ break;
+
case PS_SUSPENDED:
if (pthread->suspended == SUSP_NO ||
pthread->suspended == SUSP_YES ||
+ pthread->suspended == SUSP_JOIN ||
pthread->suspended == SUSP_NOWAIT) {
/*
* This thread isn't in any scheduling
@@ -189,7 +203,6 @@ _pthread_testcancel(void)
*/
curthread->cancelflags &= ~PTHREAD_CANCELLING;
_thread_exit_cleanup();
- pthread_detach((pthread_t)curthread);
pthread_exit(PTHREAD_CANCELED);
PANIC("cancel");
}
@@ -226,7 +239,6 @@ finish_cancellation(void *arg)
if ((curthread->cancelflags & PTHREAD_CANCEL_NEEDED) != 0) {
curthread->cancelflags &= ~PTHREAD_CANCEL_NEEDED;
_thread_exit_cleanup();
- pthread_detach((pthread_t)curthread);
pthread_exit(PTHREAD_CANCELED);
}
}
OpenPOWER on IntegriCloud