diff options
author | cperciva <cperciva@FreeBSD.org> | 2004-03-17 09:37:13 +0000 |
---|---|---|
committer | cperciva <cperciva@FreeBSD.org> | 2004-03-17 09:37:13 +0000 |
commit | b9e38dc622a21a5be30dc8be380b46885e4cc3a1 (patch) | |
tree | df5a6d87e2c0322267422d72b40429e83823c8f2 /sys/kern/sysv_sem.c | |
parent | 4f4289a1af8d9b930880f1f1fb55dce056ac7a60 (diff) | |
download | FreeBSD-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/sysv_sem.c')
-rw-r--r-- | sys/kern/sysv_sem.c | 18 |
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: |