summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorcperciva <cperciva@FreeBSD.org>2004-03-17 09:37:13 +0000
committercperciva <cperciva@FreeBSD.org>2004-03-17 09:37:13 +0000
commitb9e38dc622a21a5be30dc8be380b46885e4cc3a1 (patch)
treedf5a6d87e2c0322267422d72b40429e83823c8f2 /sys/kern
parent4f4289a1af8d9b930880f1f1fb55dce056ac7a60 (diff)
downloadFreeBSD-src-b9e38dc622a21a5be30dc8be380b46885e4cc3a1.zip
FreeBSD-src-b9e38dc622a21a5be30dc8be380b46885e4cc3a1.tar.gz
Adjust the number of processes waiting on a semaphore properly if we're
woken up in the middle of sleeping. PR: misc/64347 Reviewed by: tjr MFC after: 7 days
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/sysv_sem.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index e07e632..1cd6e1b 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -1040,12 +1040,7 @@ semop(td, uap)
error = msleep(semaptr, sema_mtxp, (PZERO - 4) | PCATCH,
"semwait", 0);
DPRINTF(("semop: good morning (error=%d)!\n", error));
-
- if (error != 0) {
- error = EINTR;
- goto done2;
- }
- DPRINTF(("semop: good morning!\n"));
+ /* return code is checked below, after sem[nz]cnt-- */
/*
* Make sure that the semaphore still exists
@@ -1064,6 +1059,17 @@ semop(td, uap)
semptr->semzcnt--;
else
semptr->semncnt--;
+
+ /*
+ * Is it really morning, or was our sleep interrupted?
+ * (Delayed check of msleep() return code because we
+ * need to decrement sem[nz]cnt either way.)
+ */
+ if (error != 0) {
+ error = EINTR;
+ goto done2;
+ }
+ DPRINTF(("semop: good morning!\n"));
}
done:
OpenPOWER on IntegriCloud