From 79e9c9534592bc4948f4a0299f413d7cfa45479c Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 4 Dec 2022 16:35:04 +0000 Subject: audio/mixfs: fix locking for /dev/audio loopback Add "Lock rplock" as a barrier for /dev/audio loopback readers. Readers can execute concurrently (no need to acquire mixlock), we just have to make sure lbbuf[] data is written *before* mixrp is updated by audioproc(). --- sys/src/cmd/audio/mixfs/mixfs.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'sys/src/cmd/audio') diff --git a/sys/src/cmd/audio/mixfs/mixfs.c b/sys/src/cmd/audio/mixfs/mixfs.c index de6f4a557..00b51057e 100644 --- a/sys/src/cmd/audio/mixfs/mixfs.c +++ b/sys/src/cmd/audio/mixfs/mixfs.c @@ -23,9 +23,12 @@ struct Stream }; ulong mixrp; -int mixbuf[NBUF][NCHAN]; +Lock rplock; int lbbuf[NBUF][NCHAN]; + +int mixbuf[NBUF][NCHAN]; Lock mixlock; + Stream streams[16]; int @@ -89,6 +92,7 @@ audioproc(void *) { static uchar buf[NBUF*NCHAN*2]; int sweep, fd, i, j, n, m, v; + ulong rp; Stream *s; uchar *p; @@ -144,16 +148,23 @@ audioproc(void *) } p = buf; + rp = mixrp; for(i=0; i> 8; } - mixrp++; + rp++; } + + /* barrier */ + lock(&rplock); + mixrp = rp; + unlock(&rplock); + write(fd, buf, p - buf); } } @@ -182,6 +193,7 @@ fsread(Req *r) s->run = 1; } m = NBUF-1 - (long)(s->wp - mixrp); + if(m <= 0){ s->run = 1; rsleep(s); @@ -190,7 +202,6 @@ fsread(Req *r) if(m > n) m = n; - lock(&mixlock); for(i=0; iwp % NBUF][j]; @@ -199,7 +210,6 @@ fsread(Req *r) } s->wp++; } - unlock(&mixlock); n -= m; } @@ -231,6 +241,7 @@ fswrite(Req *r) s->run = 1; } m = NBUF-1 - (long)(s->wp - mixrp); + if(m <= 0){ s->run = 1; rsleep(s); -- cgit v1.2.3