summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-06-04 01:04:14 +0000
committercinap_lenrek <cinap_lenrek@centraldogma>2011-06-04 01:04:14 +0000
commitf83d4972db310ce49036b4aae5d0c1da22ca95b9 (patch)
tree683cf89745baba706c59b93eb4f9fd2b83e48a08 /sys/src
parent75edd13d7805b54bbf447022d391ce5141c55d01 (diff)
devaudio: interlock reads too
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/9/port/devaudio.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/sys/src/9/port/devaudio.c b/sys/src/9/port/devaudio.c
index 59b4382cd..193b9c9f7 100644
--- a/sys/src/9/port/devaudio.c
+++ b/sys/src/9/port/devaudio.c
@@ -215,15 +215,15 @@ audioread(Chan *c, void *a, long n, vlong off)
if(fn == nil)
error(Egreg);
+ qlock(ac);
+ if(waserror()){
+ qunlock(ac);
+ nexterror();
+ }
switch((ulong)c->qid.path){
case Qaudioctl:
case Qaudiostatus:
case Qvolume:
- qlock(ac);
- if(waserror()){
- qunlock(ac);
- nexterror();
- }
/* generate the text on first read */
if(ac->data == nil || off == 0){
long l;
@@ -237,11 +237,14 @@ audioread(Chan *c, void *a, long n, vlong off)
}
/* then serve all requests from buffer */
n = readstr(off, a, n, ac->data);
- qunlock(ac);
- poperror();
- return n;
+ break;
+
+ default:
+ n = fn(adev, a, n, off);
}
- return fn(adev, a, n, off);
+ qunlock(ac);
+ poperror();
+ return n;
}
static long