diff options
| author | forsyth <forsyth@vitanuova.com> | 2011-04-02 11:51:26 +0100 |
|---|---|---|
| committer | forsyth <forsyth@vitanuova.com> | 2011-04-02 11:51:26 +0100 |
| commit | 41858f31398f2a5187173202c165df7717217c89 (patch) | |
| tree | 3741f1c89e02700fe4f96f525e23f75f26cc1ce7 /os | |
| parent | 48c2bcd8842a77d6fca4a18505e622e9a9d3d38b (diff) | |
20110402-1151
Diffstat (limited to 'os')
| -rw-r--r-- | os/port/devsrv.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/os/port/devsrv.c b/os/port/devsrv.c index cd806052..cf58484a 100644 --- a/os/port/devsrv.c +++ b/os/port/devsrv.c @@ -597,23 +597,27 @@ srvread(Chan *c, void *va, long count, vlong offset) req.t3 = rc; csend(rd, &req); - wait.fid = c->fid; - wait.rc = rc; - wait.wc = nil; - addwaiting(sp, &wait); - h = heap(dev.Rread); r = H2D(Sys_Rread *, h); ptradd(h); if(waserror()){ ptrdel(h); destroy(r); - delwaiting(&wait); nexterror(); } + wait.fid = c->fid; + wait.rc = rc; + wait.wc = nil; + addwaiting(sp, &wait); + if(waserror()){ + delwaiting(&wait); + nexterror(); + } crecv(rc, r); + poperror(); delwaiting(&wait); + if(r->t1 != H) error(string2c(r->t1)); @@ -697,19 +701,24 @@ srvwrite(Chan *c, void *va, long count, vlong offset) w = H2D(Sys_Rwrite *, h); ptradd(h); + if(waserror()){ + ptrdel(h); + destroy(w); + nexterror(); + } + wait.fid = c->fid; wait.rc = nil; wait.wc = wc; addwaiting(sp, &wait); - if(waserror()){ delwaiting(&wait); - ptrdel(h); - destroy(w); nexterror(); } crecv(wc, w); + poperror(); delwaiting(&wait); + if(w->t1 != H) error(string2c(w->t1)); poperror(); |
