From feaa8d4d2ede2f97295676a646e32ecb3036750a Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 17 Mar 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-03-17 --- ip/tcp.c | 1 + port/devproc.c | 28 +++++++++++++++------------- port/qio.c | 11 +++++++++++ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/ip/tcp.c b/ip/tcp.c index db86617df1bd9e5207be2daa89d9145433584402..be3340bebd988ce1dbfb3d222ad24803c2c9a161 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -377,6 +377,7 @@ tcpclose(Conv *c) qhangup(c->rq, nil); qhangup(c->wq, nil); qhangup(c->eq, nil); + qflush(c->rq); switch(tcb->state) { case Listen: diff --git a/port/devproc.c b/port/devproc.c index ff0fe91a0687aae05646fe73222bdf699821f6cf..f5f226855f498626be794870e22af0c0d50fc837 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -851,10 +851,18 @@ procstopwait(Proc *p, int ctl) } void -procctlfgrp(Fgrp *f) +procctlclosefiles(Proc *p) { int i; Chan *c; + Fgrp *f; + + qlock(&p->debug); + f = p->fgrp; + if(f == nil){ + qunlock(&p->debug); + error(Eprocdied); + } lock(f); f->ref++; @@ -863,12 +871,16 @@ procctlfgrp(Fgrp *f) if(c != 0) { f->fd[i] = 0; unlock(f); + qunlock(&p->debug); cclose(c); + qlock(&p->debug); lock(f); } } unlock(f); closefgrp(f); + + qunlock(&p->debug); } void @@ -924,18 +936,8 @@ procctlreq(Proc *p, char *va, int n) ready(p); } else - if(strncmp(buf, "closefiles", 10) == 0){ - qlock(&p->debug); - if(waserror()){ - qunlock(&p->debug); - nexterror(); - } - if(p->fgrp == nil) - error(Eprocdied); - procctlfgrp(p->fgrp); - qunlock(&p->debug); - poperror(); - } + if(strncmp(buf, "closefiles", 10) == 0) + procctlclosefiles(p); else if(strncmp(buf, "pri", 3) == 0) { if(n < 4) diff --git a/port/qio.c b/port/qio.c index d6ea7eb4b39b4b33acfadf0310f06e67e65db436..f06c76e9955585bff9f033a40876955d18b85450 100644 --- a/port/qio.c +++ b/port/qio.c @@ -532,6 +532,11 @@ qpass(Queue *q, Block *b) iunlock(q); return -1; } + if(q->state & Qclosed){ + freeblist(b); + iunlock(q); + return BALLOC(b); + } /* add buffer to queue */ if(q->bfirst) @@ -575,6 +580,12 @@ qpassnolim(Queue *q, Block *b) dowakeup = 0; ilock(q); + if(q->state & Qclosed){ + freeblist(b); + iunlock(q); + return BALLOC(b); + } + /* add buffer to queue */ if(q->bfirst) q->blast->next = b;