From 79f19215092bf0da6e0f0213075764cbce8e993d Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 14 Sep 1990 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1990-09-14 --- gnot/chan.c | 23 +++++++++++++++++++++-- gnot/dat.h | 1 + gnot/devcons.c | 4 +++- gnot/proc.c | 1 + gnot/screen.c | 9 +++------ gnot/stasync.c | 15 ++++++++------- gnot/stream.c | 33 +++++++++++++++++---------------- port/chan.c | 20 ++++++++++++++++++-- port/devproc.c | 6 ++++++ port/stream.c | 19 ++++++++++--------- 10 files changed, 88 insertions(+), 43 deletions(-) diff --git a/gnot/chan.c b/gnot/chan.c index 8f759071cdb0c6919441d2b884367b17d3b516ec..0cd599df6480ffed4c7c61caf6d0236d7fd292a6 100644 --- a/gnot/chan.c +++ b/gnot/chan.c @@ -96,11 +96,14 @@ loop: void close(Chan *c) { + if(c->flag & CFREE) + panic("close"); if(decref(c) == 0){ if(!waserror()){ (*devtab[c->type].close)(c); poperror(); } + c->flag = CFREE; lock(&chanalloc); c->next = chanalloc.free; chanalloc.free = c; @@ -369,11 +372,21 @@ walk(Chan *ac, char *name, int domnt) if(name[0]) /* walk succeeded */ c->flag &= ~CMOUNT; + if(domnt){ + if(waserror()){ + print("domount error\n"); + if(!first) + close(c); + return 0; + } + c = domount(c); + poperror(); + } + if(!first) close(ac); - if(domnt) - return domount(c); + return c; Notfound: @@ -422,6 +435,11 @@ createdir(Chan *c) return nc; } +void +saveregisters(void) +{ +} + /* * Turn a name into a channel. * &name[0] is known to be a valid address. It may be a kernel address. @@ -539,6 +557,7 @@ namec(char *name, int amode, int omode, ulong perm) c = nc; } Open: + saveregisters(); /* else error() in open has wrong value of c saved */ c = (*devtab[c->type].open)(c, omode); if(omode & OCEXEC) c->flag |= CCEXEC; diff --git a/gnot/dat.h b/gnot/dat.h index 547900d27e33e339c06af6d715663ad9318fdc5f..70a759a9723f334f2057026e2631eccda7ae406f 100644 --- a/gnot/dat.h +++ b/gnot/dat.h @@ -499,6 +499,7 @@ extern char *statename[]; #define CMOUNT 2 /* is result of a mount/bind */ #define CCREATE 4 /* permits creation if CMOUNT */ #define CCEXEC 8 /* close on exec */ +#define CFREE 16 /* not in use */ /* * Proc.time diff --git a/gnot/devcons.c b/gnot/devcons.c index df5a78282c4ee1b787626bf90401aea1b66da44b..21330f6d1195f1959cfd61c4838e57a675066310 100644 --- a/gnot/devcons.c +++ b/gnot/devcons.c @@ -98,13 +98,15 @@ printinit(void) klogq.out = klogq.buf; lineq.in = lineq.buf; lineq.out = lineq.buf; + rs232.in.in = rs232.in.buf; + rs232.in.out = rs232.in.buf; qlock(&kbdq); /* allocate qlock */ qunlock(&kbdq); lock(&lineq); /* allocate lock */ unlock(&lineq); lock(&klogq); /* allocate lock */ unlock(&klogq); - lock(&klogq.put); /* allocate lock */ + lock(&klogq.put); /* allocate lock */ unlock(&klogq.put); screeninit(); diff --git a/gnot/proc.c b/gnot/proc.c index cb30f17233096aa89aafbed37c46ad1c5dd2538a..800806ea5ec08adcf33dec33ba27919a502bdc83 100644 --- a/gnot/proc.c +++ b/gnot/proc.c @@ -5,6 +5,7 @@ #include "fns.h" #include "errno.h" +#include #include struct diff --git a/gnot/screen.c b/gnot/screen.c index 7dc6b133fa42c3e9239a5cf7ca0ff4a0e673acfc..d45320d454ab97a2e90544bc0e1257ecbf29e2ff 100644 --- a/gnot/screen.c +++ b/gnot/screen.c @@ -13,7 +13,6 @@ #define MINX 8 extern GFont defont0; -extern GFont defont1; GFont *defont; struct{ @@ -42,11 +41,9 @@ screeninit(void) /* * Read HEX switch to set ldepth */ - if(*(uchar*)MOUSE & (1<<4)){ + if(*(uchar*)MOUSE & (1<<4)) gscreen.ldepth = 1; - defont = &defont1; - }else - defont = &defont0; + defont = &defont0; /* save space; let bitblt do the conversion work */ gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0); out.pos.x = MINX; out.pos.y = 0; @@ -81,7 +78,7 @@ screenputc(int c) screenputc('\n'); buf[0] = c&0x7F; buf[1] = 0; - out.pos = gstring(&gscreen, out.pos, defont, buf, S); + out.pos = gbitbltstring(&gscreen, out.pos, defont, buf, S); } } diff --git a/gnot/stasync.c b/gnot/stasync.c index 5c61ad409fa14ef06d383d3eefc2b1b07f745a29..f1ccbe24f3c77260260f8c791311200a308b882b 100644 --- a/gnot/stasync.c +++ b/gnot/stasync.c @@ -11,8 +11,7 @@ * configuration */ enum { - MAXFRAME= 246, - Nasync= 1, + MAXFRAME= 256, /* also known to tsm8 code */ }; /* input states */ @@ -98,16 +97,17 @@ asyncopen(Queue *q, Stream *s) DPRINT("asyncopen %d\n", s->dev); - for(ap = async; ap < &async[Nasync]; ap++){ + for(ap = async; ap < &async[conf.nasync]; ap++){ qlock(ap); if(ap->inuse == 0) break; qunlock(ap); } - if(ap == &async[Nasync]) + if(ap == &async[conf.nasync]) error(0, Enoasync); q->ptr = q->other->ptr = ap; + ap->inuse = 1; ap->bp = 0; ap->chan = -1; ap->count = 0; @@ -120,6 +120,7 @@ asyncopen(Queue *q, Stream *s) ap->out = 0; ap->wq = WR(q); ap->state = Hunt; + qunlock(ap); } static void @@ -329,12 +330,12 @@ void asdeliver(Queue *q, Async *ap) { int chan, c; - Block *bp; + Block *bp = 0; uchar *p = ap->buf; int n = ap->icount; - chan = p[1] & 0x7e; - chan = (chan<<5)|((p[2] & 0x7e)>>1); + chan = *p++ & 0x7e; + chan = (chan<<5)|((*p++ & 0x7e)>>1); if(chan==0) { DPRINT("a%d deliver chan 0\n", ap-async); ap->chan0++; diff --git a/gnot/stream.c b/gnot/stream.c index ba10867d2d9ecd9e97714eaf56e487e0ef639772..de54d797bd5a2aea28479bd84dce507384215220 100644 --- a/gnot/stream.c +++ b/gnot/stream.c @@ -1035,15 +1035,16 @@ streamwrite(Chan *c, void *a, long n, int docopy) long rem; int i; + s = c->stream; + /* * one writer at a time - */ - s = c->stream; qlock(&s->wrlock); if(waserror()){ qunlock(&s->wrlock); nexterror(); } + */ /* * decode the qid @@ -1053,9 +1054,7 @@ streamwrite(Chan *c, void *a, long n, int docopy) break; case Sctlqid: n = streamctlwrite(s, a, n); - qunlock(&s->wrlock); - poperror(); - return n; + goto out; default: panic("bad stream qid\n"); } @@ -1104,8 +1103,9 @@ streamwrite(Chan *c, void *a, long n, int docopy) } } } - qunlock(&s->wrlock); - poperror(); +out: +/* qunlock(&s->wrlock); + poperror(); /**/ return n; } @@ -1148,16 +1148,17 @@ streamstat(Chan *c, char *db, char *name) s = c->stream; if(s == 0) - panic("streamstat"); - - q = RD(s->procq); - lock(q); - for(n=0, bp=q->first; bp; bp = bp->next){ - n += BLEN(bp); - if(bp->flags&S_DELIM) - break; + n = 0; + else { + q = RD(s->procq); + lock(q); + for(n=0, bp=q->first; bp; bp = bp->next){ + n += BLEN(bp); + if(bp->flags&S_DELIM) + break; + } + unlock(q); } - unlock(q); devdir(c, c->qid, name, n, 0, &dir); convD2M(&dir, db); diff --git a/port/chan.c b/port/chan.c index 5db16ffadb35821a9190612fee4af42f5bc97a4c..0cd599df6480ffed4c7c61caf6d0236d7fd292a6 100644 --- a/port/chan.c +++ b/port/chan.c @@ -372,11 +372,21 @@ walk(Chan *ac, char *name, int domnt) if(name[0]) /* walk succeeded */ c->flag &= ~CMOUNT; + if(domnt){ + if(waserror()){ + print("domount error\n"); + if(!first) + close(c); + return 0; + } + c = domount(c); + poperror(); + } + if(!first) close(ac); - if(domnt) - return domount(c); + return c; Notfound: @@ -425,6 +435,11 @@ createdir(Chan *c) return nc; } +void +saveregisters(void) +{ +} + /* * Turn a name into a channel. * &name[0] is known to be a valid address. It may be a kernel address. @@ -542,6 +557,7 @@ namec(char *name, int amode, int omode, ulong perm) c = nc; } Open: + saveregisters(); /* else error() in open has wrong value of c saved */ c = (*devtab[c->type].open)(c, omode); if(omode & OCEXEC) c->flag |= CCEXEC; diff --git a/port/devproc.c b/port/devproc.c index 0a6a4e10bf9c380b4cf9a3dbd0c92e17ccd28b36..a281aeda1d7182869738b49cddf090758fe21fd0 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -4,6 +4,7 @@ #include "dat.h" #include "fns.h" #include "errno.h" +#include "io.h" #include "devtab.h" @@ -282,6 +283,11 @@ procread(Chan *c, void *va, long n) n = KZERO+conf.npage0*BY2PG - c->offset; memcpy(a, (char*)c->offset, n); return n; + } else if(c->offset>=UNCACHED && c->offsetoffset+n > UNCACHED+conf.npage0*BY2PG) + n = UNCACHED+conf.npage0*BY2PG - c->offset; + memcpy(a, (char*)c->offset, n); + return n; } return 0; break; diff --git a/port/stream.c b/port/stream.c index a135d924bd994ecfec30fbb32f6607f5bab8019f..de54d797bd5a2aea28479bd84dce507384215220 100644 --- a/port/stream.c +++ b/port/stream.c @@ -1148,16 +1148,17 @@ streamstat(Chan *c, char *db, char *name) s = c->stream; if(s == 0) - panic("streamstat"); - - q = RD(s->procq); - lock(q); - for(n=0, bp=q->first; bp; bp = bp->next){ - n += BLEN(bp); - if(bp->flags&S_DELIM) - break; + n = 0; + else { + q = RD(s->procq); + lock(q); + for(n=0, bp=q->first; bp; bp = bp->next){ + n += BLEN(bp); + if(bp->flags&S_DELIM) + break; + } + unlock(q); } - unlock(q); devdir(c, c->qid, name, n, 0, &dir); convD2M(&dir, db);