diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-06-04 01:04:14 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-06-04 01:04:14 +0000 |
commit | f83d4972db310ce49036b4aae5d0c1da22ca95b9 (patch) | |
tree | 683cf89745baba706c59b93eb4f9fd2b83e48a08 /sys/src | |
parent | 75edd13d7805b54bbf447022d391ce5141c55d01 (diff) |
devaudio: interlock reads too
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/9/port/devaudio.c | 21 |
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 |