Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/sys_pipe.c
Show First 20 Lines • Show All 616 Lines • ▼ Show 20 Lines | pipelock(struct pipe *cpipe, int catch) | ||||
int error, prio; | int error, prio; | ||||
PIPE_LOCK_ASSERT(cpipe, MA_OWNED); | PIPE_LOCK_ASSERT(cpipe, MA_OWNED); | ||||
prio = PRIBIO; | prio = PRIBIO; | ||||
if (catch) | if (catch) | ||||
prio |= PCATCH; | prio |= PCATCH; | ||||
while (cpipe->pipe_state & PIPE_LOCKFL) { | 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), | error = msleep(cpipe, PIPE_MTX(cpipe), | ||||
prio, "pipelk", 0); | prio, "pipelk", 0); | ||||
cpipe->pipe_waiters--; | |||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
} | } | ||||
cpipe->pipe_state |= PIPE_LOCKFL; | cpipe->pipe_state |= PIPE_LOCKFL; | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
* unlock a pipe I/O lock | * unlock a pipe I/O lock | ||||
*/ | */ | ||||
static __inline void | static __inline void | ||||
pipeunlock(struct pipe *cpipe) | pipeunlock(struct pipe *cpipe) | ||||
{ | { | ||||
PIPE_LOCK_ASSERT(cpipe, MA_OWNED); | PIPE_LOCK_ASSERT(cpipe, MA_OWNED); | ||||
KASSERT(cpipe->pipe_state & PIPE_LOCKFL, | KASSERT(cpipe->pipe_state & PIPE_LOCKFL, | ||||
("Unlocked pipe passed to pipeunlock")); | ("Unlocked pipe passed to pipeunlock")); | ||||
KASSERT(cpipe->pipe_waiters >= 0, | |||||
("%s: bad waiter count %d", __func__, | |||||
cpipe->pipe_waiters)); | |||||
cpipe->pipe_state &= ~PIPE_LOCKFL; | cpipe->pipe_state &= ~PIPE_LOCKFL; | ||||
if (cpipe->pipe_state & PIPE_LWANT) { | if (cpipe->pipe_waiters > 0) { | ||||
cpipe->pipe_state &= ~PIPE_LWANT; | wakeup_one(cpipe); | ||||
wakeup(cpipe); | |||||
} | } | ||||
} | } | ||||
void | void | ||||
pipeselwakeup(struct pipe *cpipe) | pipeselwakeup(struct pipe *cpipe) | ||||
{ | { | ||||
PIPE_LOCK_ASSERT(cpipe, MA_OWNED); | PIPE_LOCK_ASSERT(cpipe, MA_OWNED); | ||||
▲ Show 20 Lines • Show All 1,160 Lines • Show Last 20 Lines |