summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authormatk <matk@FreeBSD.org>2004-02-19 01:07:15 +0000
committermatk <matk@FreeBSD.org>2004-02-19 01:07:15 +0000
commitc8130a438cb63b68552b56f0a7e165e50e05f634 (patch)
tree9dd943caa5f5edc7bdd5cd4e26ba660084606b4f /sys/dev
parent1dc86cc4a5674caaad7b4ce05dcc6690498ac45e (diff)
downloadFreeBSD-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.c16
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);
}
OpenPOWER on IntegriCloud