diff options
author | matk <matk@FreeBSD.org> | 2004-02-19 01:07:15 +0000 |
---|---|---|
committer | matk <matk@FreeBSD.org> | 2004-02-19 01:07:15 +0000 |
commit | c8130a438cb63b68552b56f0a7e165e50e05f634 (patch) | |
tree | 9dd943caa5f5edc7bdd5cd4e26ba660084606b4f /sys/dev | |
parent | 1dc86cc4a5674caaad7b4ce05dcc6690498ac45e (diff) | |
download | FreeBSD-src-c8130a438cb63b68552b56f0a7e165e50e05f634.zip FreeBSD-src-c8130a438cb63b68552b56f0a7e165e50e05f634.tar.gz |
Fix a long-standing bug where select on vchans doesn't work
(never wake up) by iterating over them when they exist.
Approved by: tanimura (mentor)
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/sound/pcm/channel.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c index 610f69c..baf34fd 100644 --- a/sys/dev/sound/pcm/channel.c +++ b/sys/dev/sound/pcm/channel.c @@ -115,11 +115,21 @@ chn_pollreset(struct pcm_channel *c) static void chn_wakeup(struct pcm_channel *c) { - struct snd_dbuf *bs = c->bufsoft; + struct snd_dbuf *bs = c->bufsoft; + struct pcmchan_children *pce; CHN_LOCKASSERT(c); - if (SEL_WAITING(sndbuf_getsel(bs)) && chn_polltrigger(c)) - selwakeuppri(sndbuf_getsel(bs), PRIBIO); + if (SLIST_EMPTY(&c->children)) { + if (SEL_WAITING(sndbuf_getsel(bs)) && chn_polltrigger(c)) + selwakeup(sndbuf_getsel(bs)); + } else { + SLIST_FOREACH(pce, &c->children, link) { + CHN_LOCK(pce->channel); + chn_wakeup(pce->channel); + CHN_UNLOCK(pce->channel); + } + } + wakeup(bs); } |