M ip/tcp.c => ip/tcp.c +1 -0
@@ 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:
M port/devproc.c => port/devproc.c +15 -13
@@ 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)
M port/qio.c => port/qio.c +11 -0
@@ 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;