summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_umtx.c4
-rw-r--r--sys/kern/uipc_sem.c2
2 files changed, 3 insertions, 3 deletions
diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c
index 6026b80..74d6d1e 100644
--- a/sys/kern/kern_umtx.c
+++ b/sys/kern/kern_umtx.c
@@ -2980,7 +2980,9 @@ do_sem_wait(struct thread *td, struct _usem *sem, struct _umtx_time *timeout)
error = 0;
else {
umtxq_remove(uq);
- if (error == ERESTART)
+ /* A relative timeout cannot be restarted. */
+ if (error == ERESTART && timeout != NULL &&
+ (timeout->_flags & UMTX_ABSTIME) == 0)
error = EINTR;
}
umtxq_unlock(&uq->uq_key);
diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c
index 0ea84fd..509f32e 100644
--- a/sys/kern/uipc_sem.c
+++ b/sys/kern/uipc_sem.c
@@ -846,8 +846,6 @@ kern_sem_wait(struct thread *td, semid_t id, int tryflag,
err:
mtx_unlock(&sem_lock);
fdrop(fp, td);
- if (error == ERESTART)
- error = EINTR;
DP(("<<< kern_sem_wait leaving, pid=%d, error = %d\n",
(int)td->td_proc->p_pid, error));
return (error);
OpenPOWER on IntegriCloud