From 123b9a72f9791f9d29d76ef10918a03cf0533e29 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 16 Nov 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-11-16 --- pc/clock.c | 2 ++ port/devcons.c | 16 ++++++++-------- port/devdk.c | 44 ++++++++++++++++++++++++++++++-------------- port/devproc.c | 2 +- port/net.c | 4 ++-- 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/pc/clock.c b/pc/clock.c index 9813a1fa87583fab19728a79dd736ab35e5b68ee..376f3f59189443b6d1467df15416c92e23c9ee60 100644 --- a/pc/clock.c +++ b/pc/clock.c @@ -87,10 +87,12 @@ clock(Ureg *ur) else sched(); } +#ifdef asdf if((ur->cs&0xffff) == UESEL){ spllo(); /* in case we fault */ (*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1); /* profiling clock */ splhi(); } +#endif asdf } } diff --git a/port/devcons.c b/port/devcons.c index 5624e45539bb350455306d9d962c1820549c4477..8c5858dd0bdc8e0912d045ed7ca2f48d8fcf4562 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -679,7 +679,7 @@ conswrite(Chan *c, void *va, long n, ulong offset) { char cbuf[64]; char buf[256]; - long l, m; + long l, bp; char *a = va; Mach *mp; int id, fd; @@ -693,13 +693,13 @@ conswrite(Chan *c, void *va, long n, ulong offset) */ l = n; while(l > 0){ - m = l; - if(m > sizeof buf) - m = sizeof buf; - memmove(buf, a, m); - putstrn(a, m); - a += m; - l -= m; + bp = l; + if(bp > sizeof buf) + bp = sizeof buf; + memmove(buf, a, bp); + putstrn(a, bp); + a += bp; + l -= bp; } break; diff --git a/port/devdk.c b/port/devdk.c index d2c4c9c997dd248a14cc4e793733154da9d62c53..1dcee34dc97271a420e701431985b14f409b8ed9 100644 --- a/port/devdk.c +++ b/port/devdk.c @@ -106,14 +106,17 @@ struct Line { * dkmux line discipline is pushed onto. */ struct Dk { + QLock; + Chan *csc; + Lock; int opened; + char name[64]; /* dk name */ Queue *wq; /* dk output queue */ Stream *s; - int lines; /* number of lines */ int ncsc; /* csc line number */ - Chan *csc; + int lines; /* number of lines */ Line **linep; int restart; int urpwindow; @@ -123,7 +126,7 @@ struct Dk { Network net; Netprot *prot; - Block *alloc; + Block *alloc; /* blocks containing Line structs */ }; static Dk *dk; static Lock dklock; @@ -179,6 +182,7 @@ extern Qinfo urpinfo; Chan* dkattach(char*); static void dkmuxconfig(Queue*, Block*); static Chan* dkopenline(Dk*, int); +static Chan* dkopencsc(Dk*); static int dkmesg(Chan*, int, int, int, int); static void dkcsckproc(void*); static void dkanswer(Chan*, int, int); @@ -504,7 +508,7 @@ dkstclose(Queue *q) close(c); goto out; } - c = dkopenline(dp, dp->ncsc); + c = dkopencsc(dp); /* * shake hands with dk @@ -536,8 +540,11 @@ dkstclose(Queue *q) out: qlock(lp); lp->rq = 0; - netdisown(&dp->net, lp->lineno); qunlock(lp); + + if(lp->lineno == dp->ncsc) + dp->csc = 0; + netdisown(&dp->net, lp->lineno); } /* @@ -672,7 +679,7 @@ dkmuxconfig(Queue *q, Block *bp) * all fighting for it at once. */ dp->closeall = 0; - dp->csc = dkopenline(dp, dp->ncsc); + dkopencsc(dp); /* * start a process to listen to csc messages @@ -873,9 +880,6 @@ dkcloneline(Chan *c) error(Enodev); } -/* - * open the common signalling channel - */ static Chan* dkopenline(Dk *dp, int line) { @@ -895,6 +899,21 @@ dkopenline(Dk *dp, int line) return c; } +/* + * open the common signalling channel + */ +static Chan* +dkopencsc(Dk *dp) +{ + qlock(dp); + if(dp->csc == 0) + dp->csc = dkopenline(dp, dp->ncsc); + else + incref(dp->csc); + qunlock(dp); + return dp->csc; +} + /* * return the contents of the info files */ @@ -1037,7 +1056,7 @@ dkcall(int type, Chan *c, char *addr, char *nuser, char *machine) * tell the controller we want to make a call */ DPRINT("dialout\n"); - csc = dkopenline(dp, dp->ncsc); + csc = dkopencsc(dp); if(waserror()){ close(csc); nexterror(); @@ -1610,10 +1629,7 @@ dktimer(void *a) return; } - /* - * open csc - */ - c = dkopenline(dp, dp->ncsc); + c = dkopencsc(dp); for(;;){ if(dp->opened==0) diff --git a/port/devproc.c b/port/devproc.c index 598bcf754dd4a85be59731ab4f21ff3c80252641..15a3bd882a8cd684355d885299d58f7fee63d2d4 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -426,7 +426,7 @@ procwrite(Chan *c, void *va, long n, ulong offset) case Qnote: if(p->kp) - errors("can' t note kproc"); + errors("can't note kproc"); k = kmap(p->upage); up = (User*)VA(k); if(up->p != p){ diff --git a/port/net.c b/port/net.c index 97dc6287d837cd799b8066e0017f10a12dbfbd79..c9dc4bad0259bde979debd1cfb32503bc4afd20b 100644 --- a/port/net.c +++ b/port/net.c @@ -180,8 +180,6 @@ netopen(Chan *c, int omode, Network *np) case Sdataqid: case Sctlqid: id = STREAMID(c->qid.path); - if(netown(np, id, u->p->user, omode&7) < 0) - error(Eperm); break; case Qlisten: streamopen(c, np->devp); @@ -203,6 +201,8 @@ netopen(Chan *c, int omode, Network *np) streamopen(c, np->devp); if(np->protop && c->stream->devq->next->info != np->protop) pushq(c->stream, np->protop); + if(netown(np, id, u->p->user, omode&7) < 0) + error(Eperm); break; } }