summaryrefslogtreecommitdiff
path: root/emu/port/devsrv.c
diff options
context:
space:
mode:
authorforsyth <forsyth@vitanuova.com>2011-04-02 11:51:26 +0100
committerforsyth <forsyth@vitanuova.com>2011-04-02 11:51:26 +0100
commit41858f31398f2a5187173202c165df7717217c89 (patch)
tree3741f1c89e02700fe4f96f525e23f75f26cc1ce7 /emu/port/devsrv.c
parent48c2bcd8842a77d6fca4a18505e622e9a9d3d38b (diff)
20110402-1151
Diffstat (limited to 'emu/port/devsrv.c')
-rw-r--r--emu/port/devsrv.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/emu/port/devsrv.c b/emu/port/devsrv.c
index cef59c05..f619183d 100644
--- a/emu/port/devsrv.c
+++ b/emu/port/devsrv.c
@@ -594,23 +594,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));
@@ -694,19 +698,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();