static __inline void pipeselwakeup (struct pipe *cpipe);
static int pipespace (struct pipe *cpipe, int size);
+static __inline int
+pipeseltest(struct pipe *cpipe)
+{
+ return ((cpipe->pipe_state & PIPE_SEL) ||
+ ((cpipe->pipe_state & PIPE_ASYNC) && cpipe->pipe_sigio) ||
+ SLIST_FIRST(&cpipe->pipe_sel.si_note));
+}
+
static __inline void
pipeselwakeup(struct pipe *cpipe)
{
lwkt_reltoken(&wlock);
}
}
- if (rpipe->pipe_state & PIPE_SEL) {
+ if (pipeseltest(rpipe)) {
lwkt_gettoken(&wlock, &rpipe->pipe_wlock);
pipeselwakeup(rpipe);
lwkt_reltoken(&wlock);
lwkt_reltoken(&rlock);
}
}
- if (wpipe->pipe_state & PIPE_SEL) {
+ if (pipeseltest(wpipe)) {
lwkt_gettoken(&rlock, &wpipe->pipe_rlock);
pipeselwakeup(wpipe);
lwkt_reltoken(&rlock);