diff options
Diffstat (limited to 'usr/src/uts/common/syscall/sem.c')
-rw-r--r-- | usr/src/uts/common/syscall/sem.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/usr/src/uts/common/syscall/sem.c b/usr/src/uts/common/syscall/sem.c index 95d1825dc9..d1bde2ff2d 100644 --- a/usr/src/uts/common/syscall/sem.c +++ b/usr/src/uts/common/syscall/sem.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -874,6 +874,7 @@ semop(int semid, struct sembuf *sops, size_t nsops, timespec_t *timeout) struct sembuf *uops; /* ptr to copy of user ops */ struct sembuf x_sem; /* avoid kmem_alloc's */ timespec_t now, ts, *tsp = NULL; + int timecheck = 0; int cvres, needundo, mode; struct sem_undo *undo; proc_t *pp = curproc; @@ -897,6 +898,7 @@ semop(int semid, struct sembuf *sops, size_t nsops, timespec_t *timeout) * we can legally not validate 'timeout' if it is unused. */ if (timeout != NULL) { + timecheck = timechanged; gethrestime(&now); if (error = compute_timeout(&tsp, &ts, &now, timeout)) return (set_errno(error)); @@ -1087,7 +1089,8 @@ check: ipc_hold(sem_svc, (kipc_perm_t *)sp); } semp->semncnt++; - cvres = cv_waituntil_sig(&semp->semncnt_cv, lock, tsp); + cvres = cv_waituntil_sig(&semp->semncnt_cv, lock, + tsp, timecheck); lock = ipc_relock(sem_svc, sp->sem_perm.ipc_id, lock); if (!IPC_FREE(&sp->sem_perm)) { @@ -1123,7 +1126,8 @@ check: ipc_hold(sem_svc, (kipc_perm_t *)sp); } semp->semzcnt++; - cvres = cv_waituntil_sig(&semp->semzcnt_cv, lock, tsp); + cvres = cv_waituntil_sig(&semp->semzcnt_cv, lock, + tsp, timecheck); lock = ipc_relock(sem_svc, sp->sem_perm.ipc_id, lock); /* |