devaudio: interlock reads too

This commit is contained in:
cinap_lenrek 2011-06-04 01:04:14 +00:00
parent 75edd13d78
commit f83d4972db

View file

@ -215,15 +215,15 @@ audioread(Chan *c, void *a, long n, vlong off)
if(fn == nil) if(fn == nil)
error(Egreg); error(Egreg);
qlock(ac);
if(waserror()){
qunlock(ac);
nexterror();
}
switch((ulong)c->qid.path){ switch((ulong)c->qid.path){
case Qaudioctl: case Qaudioctl:
case Qaudiostatus: case Qaudiostatus:
case Qvolume: case Qvolume:
qlock(ac);
if(waserror()){
qunlock(ac);
nexterror();
}
/* generate the text on first read */ /* generate the text on first read */
if(ac->data == nil || off == 0){ if(ac->data == nil || off == 0){
long l; long l;
@ -237,11 +237,14 @@ audioread(Chan *c, void *a, long n, vlong off)
} }
/* then serve all requests from buffer */ /* then serve all requests from buffer */
n = readstr(off, a, n, ac->data); n = readstr(off, a, n, ac->data);
qunlock(ac); break;
poperror();
return n; default:
n = fn(adev, a, n, off);
} }
return fn(adev, a, n, off); qunlock(ac);
poperror();
return n;
} }
static long static long