summaryrefslogtreecommitdiffstats
path: root/lib/libc_r/uthread/uthread_cancel.c
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2000-03-15 13:59:27 +0000
committerdeischen <deischen@FreeBSD.org>2000-03-15 13:59:27 +0000
commit228266df1122dd0b3102d45629ae1e0d7ae42f31 (patch)
treedbe86a4d7c4333049e4c8db5b8b117b8ae2e6c7c /lib/libc_r/uthread/uthread_cancel.c
parent87a0ee8fd64ec5f1e02e3bef4a0de750d7bede50 (diff)
downloadFreeBSD-src-228266df1122dd0b3102d45629ae1e0d7ae42f31.zip
FreeBSD-src-228266df1122dd0b3102d45629ae1e0d7ae42f31.tar.gz
Fix pthread_suspend_np/pthread_resume_np. For the record, suspending a
thread waiting on an event (I/O, condvar, etc) will, when resumed using pthread_resume_np, return with EINTR. For example, suspending and resuming a thread blocked on read() will not requeue the thread for the read, but will return -1 with errno = EINTR. If the suspended thread is in a critical region, the thread is suspended as soon as it leaves the critical region. Fix a bogon in pthread_kill() where a signal was being delivered twice to threads waiting in sigwait(). Reported by (suspend/resume bug): jdp Reviewed by: jasone
Diffstat (limited to 'lib/libc_r/uthread/uthread_cancel.c')
-rw-r--r--lib/libc_r/uthread/uthread_cancel.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/lib/libc_r/uthread/uthread_cancel.c b/lib/libc_r/uthread/uthread_cancel.c
index f22bfb5..82ddbb8 100644
--- a/lib/libc_r/uthread/uthread_cancel.c
+++ b/lib/libc_r/uthread/uthread_cancel.c
@@ -37,6 +37,15 @@ pthread_cancel(pthread_t pthread)
pthread->cancelflags |= PTHREAD_CANCELLING;
break;
+ case PS_SUSPENDED:
+ /*
+ * This thread isn't in any scheduling
+ * queues; just change it's state:
+ */
+ pthread->cancelflags |= PTHREAD_CANCELLING;
+ PTHREAD_SET_STATE(pthread, PS_RUNNING);
+ break;
+
case PS_SPINBLOCK:
case PS_FDR_WAIT:
case PS_FDW_WAIT:
@@ -52,7 +61,6 @@ pthread_cancel(pthread_t pthread)
case PS_WAIT_WAIT:
case PS_SIGSUSPEND:
case PS_SIGWAIT:
- case PS_SUSPENDED:
/* Interrupt and resume: */
pthread->interrupted = 1;
pthread->cancelflags |= PTHREAD_CANCELLING;
OpenPOWER on IntegriCloud