From 04c3e880b1ee84f5ccfe964acdb30f7898995ad0 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 1 Aug 1990 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1990-08-01 --- gnot/devpipe.c | 5 +---- gnot/fns.h | 1 + gnot/stream.c | 31 +++++++++++++++++++++++++++++++ port/devpipe.c | 5 +---- port/page.c | 37 ++++++++++++++++++++++++++++++++++++- port/proc.c | 1 + port/stream.c | 33 ++++++++++++++++++++++++++++++++- power/dat.h | 6 +++--- power/fns.h | 2 ++ power/main.c | 4 ++-- 10 files changed, 110 insertions(+), 15 deletions(-) diff --git a/gnot/devpipe.c b/gnot/devpipe.c index 9df787e1136966acee0ec6085c347c853074a742..08a1ec1065412cb13fd34ba5a974b2589f37aed6 100644 --- a/gnot/devpipe.c +++ b/gnot/devpipe.c @@ -87,10 +87,7 @@ pipewalk(Chan *c, char *name) void pipestat(Chan *c, char *db) { - Dir dir; - - devdir(c, c->qid, "pipe", 0, 0, &dir); - convD2M(&dir, db); + streamstat(c, db, "pipe"); } Chan * diff --git a/gnot/fns.h b/gnot/fns.h index 7835acc6257dc58b4ab358431fac15635e4fed25..d74b10897f92ef49423a5675bc3505cde05edb91 100644 --- a/gnot/fns.h +++ b/gnot/fns.h @@ -148,6 +148,7 @@ long streamwrite(Chan*, void*, long, int); Stream* streamnew(Chan*, Qinfo*); void streamopen(Chan*, Qinfo*); int streamparse(char*, Block*); +void streamstat(Chan*, char*, char*); long stringread(Chan*, void*, long, char*); long syscall(Ureg*); int tas(char*); diff --git a/gnot/stream.c b/gnot/stream.c index 3ed07bd64db269f236e6d66396f4619370e3943f..645de94f5e194dfc528adf644e4856cd0e0eb514 100644 --- a/gnot/stream.c +++ b/gnot/stream.c @@ -6,6 +6,7 @@ #include "io.h" #include "errno.h" #include "devtab.h" +#include "fcall.h" enum { Nclass=4, /* number of block classes */ @@ -1156,3 +1157,33 @@ getfields(char *lp, /* to be parsed */ } return i; } + +/* + * stat a stream. the length is the number of bytes up to the + * first delimiter. + */ +void +streamstat(Chan *c, char *db, char *name) +{ + Dir dir; + Stream *s; + Queue *q; + Block *bp; + long n; + + 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; + } + unlock(q); + + devdir(c, c->qid, name, n, 0, &dir); + convD2M(&dir, db); +} diff --git a/port/devpipe.c b/port/devpipe.c index 9df787e1136966acee0ec6085c347c853074a742..08a1ec1065412cb13fd34ba5a974b2589f37aed6 100644 --- a/port/devpipe.c +++ b/port/devpipe.c @@ -87,10 +87,7 @@ pipewalk(Chan *c, char *name) void pipestat(Chan *c, char *db) { - Dir dir; - - devdir(c, c->qid, "pipe", 0, 0, &dir); - convD2M(&dir, db); + streamstat(c, db, "pipe"); } Chan * diff --git a/port/page.c b/port/page.c index 82b7bd028f772dadcadbdd4123ed945e064e3554..eb85fb0dfeece75d5c97d96fd17632600972ad1c 100644 --- a/port/page.c +++ b/port/page.c @@ -251,6 +251,40 @@ usepage(Page *p, int dolock) unlock(&palloc); } +/* + * Move page to tail of list + */ +void +unusepage(Page *p, int dolock) +{ +return; + if(dolock) + lock(&palloc); + /* + * Unlink + */ + if(p->prev) + p->prev->next = p->next; + else + palloc.head = p->next; + if(p->next) + p->next->prev = p->prev; + else + palloc.tail = p->prev; + /* + * Link + */ + p->prev = palloc.tail; + p->next = 0; + if(p->prev) + p->prev->next = p; + else + palloc.head = p; + palloc.tail = p; + if(dolock) + unlock(&palloc); +} + Orig* lookorig(ulong va, ulong npte, int flag, Chan *c) { @@ -493,7 +527,7 @@ segaddr(Seg *s, ulong min, ulong max) if(max < min) return 0; -if(max > 20*1024*1024) pprint("segaddr %lux\n", max); +if(max > 20*1024*1024) {pprint("segaddr %lux\n", max);print("segaddr %lux\n", max);} if(min != s->minva) /* can't grow down yet (stacks: fault.c) */ return 0; max = (max+(BY2PG-1)) & ~(BY2PG-1); @@ -531,6 +565,7 @@ freepage(Orig *o) for(i=0; inpte; i++,pte++) if(pg = pte->page){ /* assign = */ if(pg->ref == 1){ + unusepage(pg, 1); pte->page = 0; pg->o = 0; } diff --git a/port/proc.c b/port/proc.c index ede1322f36f5eeebfb5b46de07e3c8712d140b62..625c711f4a9c53fbbfa7a8a2abad27eaf774ed52 100644 --- a/port/proc.c +++ b/port/proc.c @@ -59,6 +59,7 @@ schedinit(void) /* never returns */ else if(p->state == Moribund){ p->pid = 0; unlock(&p->debug); + unusepage(p->upage, 1); p->upage->ref--; /* procalloc already locked */ p->qnext = procalloc.free; diff --git a/port/stream.c b/port/stream.c index f039fa1c9d8ac0742873813fa4bbac12691e18d7..645de94f5e194dfc528adf644e4856cd0e0eb514 100644 --- a/port/stream.c +++ b/port/stream.c @@ -6,6 +6,7 @@ #include "io.h" #include "errno.h" #include "devtab.h" +#include "fcall.h" enum { Nclass=4, /* number of block classes */ @@ -72,7 +73,7 @@ dumpblocks(Queue *q, char c) lock(q); for(bp = q->first; bp; bp = bp->next){ - print("%c%d%c", c, bp->wptr-bp->rptr, (bp->flags&S_DELIM)?'D':' '); + print("%c%d%c", c, bp->wptr-bp->rptr, (bp->flags&S_DELIM)); for(cp = bp->rptr; cpwptr && cprptr+10; cp++) print(" %uo", *cp); print("\n"); @@ -1156,3 +1157,33 @@ getfields(char *lp, /* to be parsed */ } return i; } + +/* + * stat a stream. the length is the number of bytes up to the + * first delimiter. + */ +void +streamstat(Chan *c, char *db, char *name) +{ + Dir dir; + Stream *s; + Queue *q; + Block *bp; + long n; + + 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; + } + unlock(q); + + devdir(c, c->qid, name, n, 0, &dir); + convD2M(&dir, db); +} diff --git a/power/dat.h b/power/dat.h index 7cccd9b539760cf2b8c7901afdeca9472db6fd91..86ca8af6329a795accdb3f08f1a3f9c7a547f2e5 100644 --- a/power/dat.h +++ b/power/dat.h @@ -509,12 +509,13 @@ struct Nohdr { * a buffer describing a nonet message */ struct Nomsg { - QLock; Blist; + Rendez r; int mid; /* sequence number */ int rem; /* remaining */ long time; int acked; + int inuse; }; /* @@ -532,13 +533,13 @@ struct Noconv { int rcvcircuit; /* circuit number of incoming packets */ uchar ack[Nnomsg]; /* acknowledgements waiting to be sent */ - long atime[Nnomsg]; int afirst; int anext; QLock xlock; /* one trasmitter at a time */ Rendez r; /* process waiting for an output mid */ Nomsg ctl; /* for control messages */ + QLock mlock; /* lock for out */ Nomsg out[Nnomsg]; /* messages being sent */ int first; /* first unacknowledged message */ int next; /* next message buffer to use */ @@ -547,7 +548,6 @@ struct Noconv { Nohdr *hdr; /* nonet header inside of media header */ Noifc *ifc; - int kstarted; char raddr[NAMELEN]; /* remote address */ char ruser[NAMELEN]; /* remote user */ char addr[NAMELEN]; /* local address */ diff --git a/power/fns.h b/power/fns.h index 812f5f4e023dd3e7eb76bc153bffeb9a070c8b78..e546eae3c81842b1370da7087c1bc1b3b07674a8 100644 --- a/power/fns.h +++ b/power/fns.h @@ -171,6 +171,7 @@ long streamwrite(Chan*, void*, long, int); Stream* streamnew(Chan*, Qinfo*); void streamopen(Chan*, Qinfo*); int streamparse(char*, Block*); +void streamstat(Chan*, char*, char*); long stringread(Chan*, void*, long, char*); long syscall(Ureg*); void sysloginit(void); @@ -180,6 +181,7 @@ void touser(void *); void tsleep(Rendez*, int (*)(void*), void*, int); void twakeme(Alarm*); void unlock(Lock*); +void unusepage(Page*, int); void usepage(Page*, int); void userinit(void); void urpreset(void); diff --git a/power/main.c b/power/main.c index b44f348020b2563dc23044e6458bfcafc85bfd29..c738d35e607f7992bfb1b441c1fde6b79c8e6b11 100644 --- a/power/main.c +++ b/power/main.c @@ -39,10 +39,9 @@ main(void) { int i; - icflush(0, 64*1024); + machinit(); active.exiting = 0; active.machs = 1; - machinit(); confinit(); arginit(); lockinit(); @@ -69,6 +68,7 @@ machinit(void) { int n; + icflush(0, 64*1024); n = m->machno; memset(m, 0, sizeof(Mach)); m->machno = n;