From 7dbdedb194ef5b66438c4bfd1f66063e71ffb30e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 31 Mar 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-03-31 --- port/devbridge.c | 34 +++++++++++++++++------------ port/devdraw.c | 8 +++---- port/devproc.c | 57 ++++++++++++++++++++++++++++++++++++++---------- port/proc.c | 46 ++++++++++++++++++++++---------------- 4 files changed, 97 insertions(+), 48 deletions(-) diff --git a/port/devbridge.c b/port/devbridge.c index 361df4a5c41b9a376facd309b281b131fb3c841c..00df40ba69dc138c00637030b1eac048a407567c 100644 --- a/port/devbridge.c +++ b/port/devbridge.c @@ -36,8 +36,8 @@ enum CacheSize= (CacheHash+CacheLook-1), CacheTimeout= 5*60, // timeout for cache entry in seconds - TcpMssMax = 1360, // max desirable Tcp MSS value - + TcpMssMax = 1300, // max desirable Tcp MSS value + TunnelMtu = 1400, }; static Dirtab bridgedirtab[]={ @@ -128,6 +128,7 @@ struct Port int out; // number of packets read int outmulti; // multicast or broadcast int outunknown; // unknown address + int outfrag; // fragmented the packet int nentry; // number of cache entries for this port }; @@ -183,6 +184,7 @@ static void etherread(void *a); static char *cachedump(Bridge *b); static void portfree(Port *port); static void cacheflushport(Bridge *b, int port); +static void etherwrite(Port *port, Block *bp); extern ulong parseip(uchar*, char*); @@ -814,7 +816,7 @@ cachedump(Bridge *b) static void ethermultiwrite(Bridge *b, Block *bp, Port *port) { - Chan *c; + Port *oport; Block *bp2; Etherpkt *ep; int i, mcast, bcast; @@ -833,35 +835,34 @@ ethermultiwrite(Bridge *b, Block *bp, Port *port) else bcast = 0; - c = nil; + oport = nil; for(i=0; inport; i++) { if(i == port->id || b->port[i] == nil) continue; if(mcast && !bcast && !b->port[i]->mcast) continue; - b->port[i]->out++; if(mcast) b->port[i]->outmulti++; else b->port[i]->outunknown++; // delay one so that the last write does not copy - if(c != nil) { + if(oport != nil) { b->copy++; bp2 = copyblock(bp, blocklen(bp)); if(!waserror()) { - devtab[c->type]->bwrite(c, bp2, 0); + etherwrite(oport, bp2); poperror(); } } - c = b->port[i]->data[1]; + oport = b->port[i]; } // last write free block - if(c) { + if(oport) { bp2 = bp; bp = nil; USED(bp); if(!waserror()) { - devtab[c->type]->bwrite(c, bp2, 0); + etherwrite(oport, bp2); poperror(); } } else @@ -961,7 +962,7 @@ print("tcpmsshack: odd alignment!\n"); static void etherread(void *a) { - Port *port = a, *oport; + Port *port = a; Bridge *b = port->bridge; Block *bp, *bp2; Etherpkt *ep; @@ -1016,9 +1017,7 @@ if(0)print("devbridge: etherread: blocklen = %d\n", blocklen(bp)); } else if (ce->port != port->id) { b->hit++; bp2 = bp; bp = nil; - oport = b->port[ce->port]; - oport->out++; - devtab[oport->data[1]->type]->bwrite(oport->data[1], bp2, 0); + etherwrite(b->port[ce->port], bp2); } } @@ -1033,6 +1032,13 @@ if(0)print("devbridge: etherread: blocklen = %d\n", blocklen(bp)); pexit("hangup", 1); } +static void +etherwrite(Port *port, Block *bp) +{ + port->out++; + devtab[port->data[1]->type]->bwrite(port->data[1], bp, 0); +} + // hold b lock static void portfree(Port *port) diff --git a/port/devdraw.c b/port/devdraw.c index 6bae2163ac572fbc8314045db44530858656bbe3..d68d3b7100fca0f7f7a6ef72f629d62c653b0e00 100644 --- a/port/devdraw.c +++ b/port/devdraw.c @@ -1009,7 +1009,7 @@ drawread(Chan *c, void *a, long n, vlong off) } switch(QID(c->qid)){ case Qctl: - if(n <= 12*12) + if(n < 12*12) error(Eshortread); if(cl->infoid < 0) error(Enodrawimage); @@ -1146,15 +1146,15 @@ drawwrite(Chan *c, void *a, long n, vlong off) m -= i; *q = 0; if(getfields(buf, fields, nelem(fields), 1, " ") != 4) - error("eb1"); //error(Ebadarg); + error(Ebadarg); i = strtoul(fields[0], 0, 0); red = strtoul(fields[1], 0, 0); green = strtoul(fields[2], 0, 0); blue = strtoul(fields[3], &q, 0); if(fields[3] == q) - error("eb2"); //error(Ebadarg); + error(Ebadarg); if(red>255 || green>255 || blue>255 || i<0 || i>255) - error("eb3"); //error(Ebadarg); + error(Ebadarg); red |= red<<8; red |= red<<16; green |= green<<8; diff --git a/port/devproc.c b/port/devproc.c index 8a9424f38acc3b1010aba020e747889adf75e018..f7a234e5e2ca70c543281fa087d6d3eabfc49d87 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -169,7 +169,11 @@ procopen(Chan *c, int omode) return devopen(c, omode, 0, 0, procgen); p = proctab(SLOT(c->qid)); - pg = p->pgrp; + qlock(&p->debug); + if(waserror()){ + qunlock(&p->debug); + nexterror(); + } pid = PID(c->qid); if(p->pid != pid) error(Eprocdied); @@ -182,6 +186,8 @@ procopen(Chan *c, int omode) error(Eperm); tc = proctext(c, p); tc->offset = 0; + qunlock(&p->debug); + poperror(); return tc; case Qproc: @@ -210,6 +216,9 @@ procopen(Chan *c, int omode) break; case Qnotepg: + pg = p->pgrp; + if(pg == nil) + error(Eprocdied); if(omode!=OWRITE || pg->pgrpid == 1) error(Eperm); c->pgrpid.path = pg->pgrpid+1; @@ -230,7 +239,11 @@ procopen(Chan *c, int omode) if(p->pid != pid) error(Eprocdied); - return devopen(c, omode, 0, 0, procgen); + tc = devopen(c, omode, 0, 0, procgen); + qunlock(&p->debug); + poperror(); + + return tc; } static void @@ -277,17 +290,19 @@ procfds(Proc *p, char *va, int count, long offset) Chan *c; int n, i; + qlock(&p->debug); f = p->fgrp; - if(f == nil) + if(f == nil){ + qunlock(&p->debug); return 0; + } + lock(f); if(waserror()){ unlock(f); qunlock(&p->debug); nexterror(); } - qlock(&p->debug); - lock(f); n = readstr(0, va, count, p->dot->name->s); n += snprint(va+n, count-n, "\n"); for(i = 0; i <= f->maxfd; i++) { @@ -560,15 +575,25 @@ procread(Chan *c, void *va, long n, vlong off) return sizeof(Waitmsg); case Qns: - if(p->pgrp == nil) - error(Ebadusefd); + qlock(&p->debug); + if(waserror()){ + qunlock(&p->debug); + nexterror(); + } + if(p->pgrp == nil || p->pid != PID(c->qid)) + error(Eprocdied); mw = c->aux; - if(mw->cddone) + if(mw->cddone){ + qunlock(&p->debug); + poperror(); return 0; + } mntscan(mw, p); if(mw->mh == 0){ mw->cddone = 1; i = snprint(a, n, "cd %s\n", p->dot->name->s); + qunlock(&p->debug); + poperror(); return i; } int2flag(mw->cm->flag, flag); @@ -581,13 +606,13 @@ procread(Chan *c, void *va, long n, vlong off) }else i = snprint(a, n, "bind %s %s %s\n", flag, mw->cm->to->name->s, mw->mh->from->name->s); + qunlock(&p->debug); + poperror(); return i; case Qnoteid: return readnum(offset, va, n, p->noteid, NUMSIZE); case Qfd: - if(p->fgrp == nil) - error(Ebadusefd); return procfds(p, va, n, offset); } error(Egreg); @@ -897,8 +922,18 @@ procctlreq(Proc *p, char *va, int n) ready(p); } else - if(strncmp(buf, "closefiles", 10) == 0) + 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(); + } else if(strncmp(buf, "pri", 3) == 0) { if(n < 4) diff --git a/port/proc.c b/port/proc.c index cf991297f0d61e55ab482bfcfedc591ff9a30798..6e95ee22bc7facf41a176e436eacc655f3f70edb 100644 --- a/port/proc.c +++ b/port/proc.c @@ -737,29 +737,37 @@ pexit(char *exitstr, int freemem) long utime, stime; Waitq *wq, *f, *next; Fgrp *fgrp; + Egrp *egrp; + Rgrp *rgrp; + Pgrp *pgrp; + Chan *dot; up->alarm = 0; - if(up->fgrp){ - qlock(&up->debug); - fgrp = up->fgrp; - up->fgrp = nil; - closefgrp(fgrp); - qunlock(&up->debug); - } - if(up->egrp){ - closeegrp(up->egrp); - up->egrp = nil; - } - if(up->rgrp){ - closergrp(up->rgrp); - up->rgrp = nil; - } - - cclose(up->dot); - up->dot = nil; - closepgrp(up->pgrp); + /* nil out all the resources under lock (free later) */ + qlock(&up->debug); + fgrp = up->fgrp; + up->fgrp = nil; + egrp = up->egrp; + up->egrp = nil; + rgrp = up->rgrp; + up->rgrp = nil; + pgrp = up->pgrp; up->pgrp = nil; + dot = up->dot; + up->dot = nil; + qunlock(&up->debug); + + if(fgrp) + closefgrp(fgrp); + if(egrp) + closeegrp(egrp); + if(rgrp) + closergrp(rgrp); + if(dot) + cclose(dot); + if(pgrp) + closepgrp(pgrp); /* * if not a kernel process and have a parent,