void closeclient(Client *c) { if(--c->ref == 0){ if(c->pid > 0) postnote(PNPROC, c->pid, "kill"); c->status = Hangup; close(c->fd[0]); c->fd[0] = c->fd[1] = -1; c->moribund = 1; kickwriter(c); iointerrupt(c->readerproc); iointerrupt(c->writerproc); c->activethread++; die(c); } }
void clientflush(Req *or, Client *c) { if(or->ifcall.type == Tread) findrdreq(c, or); else{ if(c->execreq == or){ c->execreq = nil; iointerrupt(c->writerproc); } findwrreq(c, or); if(c->curw == or){ c->curw = nil; iointerrupt(c->writerproc); kickwriter(c); } } }
void closeioproc(Ioproc *io) { if(io == nil) return; iointerrupt(io); while(sendp(io->c, nil) < 0) ; }
void die(Client *c) { Msg *m, *next; Req *r, *rnext; c->moribund = 1; kickwriter(c); iointerrupt(c->readerproc); iointerrupt(c->writerproc); if(--c->activethread == 0){ if(c->cmd != nocmd){ free(c->cmd); c->cmd = nocmd; } c->pid = 0; c->moribund = 0; c->status = Closed; for(m=c->mq; m && m != Zmsg; m=next){ next = m->link; free(m); } c->mq = nil; if(c->rq != nil){ for(r=c->rq; r; r=rnext){ rnext = r->aux; respond(r, "hangup"); } c->rq = nil; } if(c->wq != nil){ for(r=c->wq; r; r=rnext){ rnext = r->aux; respond(r, "hangup"); } c->wq = nil; } c->rq = nil; c->wq = nil; c->emq = nil; c->erq = nil; c->ewq = nil; } }