summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorArtur Grabowski <art@cvs.openbsd.org>2007-03-18 10:46:52 +0000
committerArtur Grabowski <art@cvs.openbsd.org>2007-03-18 10:46:52 +0000
commit80777fa4c27a8915403627b432e7b7ffc2509620 (patch)
treee622a36642da7511fa56f08080eb9d41aaf54f6a /sys
parent8a629f0baaac44144c502db8390fa16cdc8559e5 (diff)
Don't restart thrsleep after a signal. After a signal happened and we
weren't on the sleep queues, the condition we were sleeping on might have changed, so we need to go back to userland and recheck that condition. This fixes the majority of lockups and and hanging threads in rthreads since it fixes a race in the semaphore code. ok tedu@
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_synch.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
index 22dd6d31f55..8c8eded15d4 100644
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_synch.c,v 1.76 2007/03/15 10:22:30 art Exp $ */
+/* $OpenBSD: kern_synch.c,v 1.77 2007/03/18 10:46:51 art Exp $ */
/* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */
/*
@@ -396,6 +396,9 @@ sys_thrsleep(struct proc *p, void *v, register_t *revtal)
timo = 0;
error = tsleep(&p->p_thrslpid, PUSER | PCATCH, "thrsleep", timo);
+ if (error == ERESTART)
+ error = EINTR;
+
return (error);
}