aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/sys_pipe.c
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2020-11-19 19:25:47 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2020-11-19 19:25:47 +0000
commitf9fe7b28bc236c18794de577620348ccd3b0fdaa (patch)
tree8f5d624b9f5073fa70e7099f234b339d16e03d05 /sys/kern/sys_pipe.c
parent7e9e52e7a7f15490e37af49abea17763e0443413 (diff)
Notes
Diffstat (limited to 'sys/kern/sys_pipe.c')
-rw-r--r--sys/kern/sys_pipe.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index a68c3be0d442..87d49c4c1be7 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -622,9 +622,13 @@ pipelock(struct pipe *cpipe, int catch)
if (catch)
prio |= PCATCH;
while (cpipe->pipe_state & PIPE_LOCKFL) {
- cpipe->pipe_state |= PIPE_LWANT;
+ KASSERT(cpipe->pipe_waiters >= 0,
+ ("%s: bad waiter count %d", __func__,
+ cpipe->pipe_waiters));
+ cpipe->pipe_waiters++;
error = msleep(cpipe, PIPE_MTX(cpipe),
prio, "pipelk", 0);
+ cpipe->pipe_waiters--;
if (error != 0)
return (error);
}
@@ -642,10 +646,12 @@ pipeunlock(struct pipe *cpipe)
PIPE_LOCK_ASSERT(cpipe, MA_OWNED);
KASSERT(cpipe->pipe_state & PIPE_LOCKFL,
("Unlocked pipe passed to pipeunlock"));
+ KASSERT(cpipe->pipe_waiters >= 0,
+ ("%s: bad waiter count %d", __func__,
+ cpipe->pipe_waiters));
cpipe->pipe_state &= ~PIPE_LOCKFL;
- if (cpipe->pipe_state & PIPE_LWANT) {
- cpipe->pipe_state &= ~PIPE_LWANT;
- wakeup(cpipe);
+ if (cpipe->pipe_waiters > 0) {
+ wakeup_one(cpipe);
}
}