From bf675d7062050f74703ce11165847a8bd3bb86f6 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 1 Jul 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-07-01 --- gnot/devhifi.c | 11 +++++++---- gnot/devisdn.c | 18 +++++++++--------- gnot/trap.c | 2 +- port/alarm.c | 9 +++++---- port/proc.c | 27 ++++++++++++++++++--------- 5 files changed, 40 insertions(+), 27 deletions(-) diff --git a/gnot/devhifi.c b/gnot/devhifi.c index f22834b254043fe3a557df1bc064b1dbbb4b405f..d1819a3f15a0f63acd386a85ec4e6fd7eb2cd335 100644 --- a/gnot/devhifi.c +++ b/gnot/devhifi.c @@ -15,7 +15,7 @@ #define DPRINT if(hifidebug)kprint -#define BSIZE 4096 +#define BSIZE 4000 typedef struct Hifichan { @@ -433,9 +433,9 @@ Top: for(;;){ qlock(hp); while(hp->ri != hp->wi){ - if(hp->rq) - PUTNEXT(hp->rq, hp->inb[hp->ri]); - else + if(hp->rq){ + FLOWCTL(hp->rq, hp->inb[hp->ri]); + }else freeb(hp->inb[hp->ri]); if(hp->renable) hp->inb[hp->ri] = allocb(BSIZE); @@ -583,6 +583,7 @@ Loop: if(n > m){ hp->toolong++; bp->wptr = bp->base; + bp->rptr = bp->base; SET(hifi->opreg, hp->opreg | Rres); return wake; } @@ -613,6 +614,7 @@ Loop: hp->badcount++; } bp->wptr = bp->base; + bp->rptr = bp->base; }else bp->wptr = p; }else{ @@ -627,6 +629,7 @@ Loop: i = NEXT(hp->wi); if(i == hp->ri){ bp->wptr = bp->base; + bp->rptr = bp->base; return wake; }else{ bp->flags |= S_DELIM; diff --git a/gnot/devisdn.c b/gnot/devisdn.c index 871682f935a5676d101a0ec477134fb807dced8b..2251d0ea168e972ad5b42158c2619c81e14b65be 100644 --- a/gnot/devisdn.c +++ b/gnot/devisdn.c @@ -15,7 +15,7 @@ #define DPRINT if(isdndebug)kprint -#define BSIZE 260 +#define BSIZE 200 /* should be 260, but for xalloc */ Isdn * isdndev; Isdn * isdndevN; @@ -412,7 +412,7 @@ isdnkproc(void *arg) Isdn *ip = (Isdn *)arg; int i; - if (waserror()) { + if(waserror()){ devctl(ip, Enr, 0); ip->kstart = 0; wakeup(&ip->kctlr); @@ -421,7 +421,7 @@ isdnkproc(void *arg) /* * create a number of blocks for input */ - for (i=0; iinb[i]) ip->inb[i] = allocb(BSIZE); ip->ri = 0; @@ -429,19 +429,19 @@ isdnkproc(void *arg) devctl(ip, 0, Enr); ip->kstart = 1; wakeup(&ip->kctlr); - for (;;) { + for(;;){ qlock(ip); - if (!ip->rq) { + if (!ip->rq){ qunlock(ip); break; } - while (ip->ri != ip->wi) { - PUTNEXT(ip->rq, ip->inb[ip->ri]); + while (ip->ri != ip->wi){ + FLOWCTL(ip->rq, ip->inb[ip->ri]); ip->inb[ip->ri] = allocb(BSIZE); ip->ri = NEXT(ip->ri); } i = 0; - while (ip->so != ip->ro) { + while(ip->so != ip->ro){ freeb(ip->outb[ip->so]); ip->so = NEXT(ip->so); i++; @@ -453,7 +453,7 @@ isdnkproc(void *arg) } devctl(ip, Enr, 0); sleep(&ip->kr, tEmpty, ip); - while (ip->so != ip->ro) { + while(ip->so != ip->ro){ freeb(ip->outb[ip->so]); ip->so = NEXT(ip->so); } diff --git a/gnot/trap.c b/gnot/trap.c index 22961dc7bc7fc932eae0ad0f0021ec0ad654f146..3b706ae8eac037fcadefa87f2ef9aa6f43de4469 100644 --- a/gnot/trap.c +++ b/gnot/trap.c @@ -322,7 +322,7 @@ syscall(Ureg *aur) if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs))) validaddr(sp, sizeof(Sargs), 0); - u->s = *((Sargs*)(sp+BY2WD)); + u->s = *((Sargs*)(sp+1*BY2WD)); u->p->psstate = sysctab[u->scallnr]; ret = (*systab[u->scallnr])(u->s.args); diff --git a/port/alarm.c b/port/alarm.c index 7287bc62b70af39ca88a67a3c72e5730e50f884f..557d54663a6a2d79cdf0db79b8bbf96f513d2be1 100644 --- a/port/alarm.c +++ b/port/alarm.c @@ -12,10 +12,9 @@ Talarm talarm; void alarmkproc(void *arg) { - int i, n; - ulong now; Proc *rp; - int s; + ulong now; + int i, n, s; USED(arg); @@ -67,12 +66,14 @@ checkalarms(void) if(p->twhen == 0) { talarm.list = p->tlink; + p->trend = 0; continue; } if(now < p->twhen) break; - talarm.list = p->tlink; wakeup(p->trend); + talarm.list = p->tlink; + p->trend = 0; } unlock(&talarm); diff --git a/port/proc.c b/port/proc.c index 265dc1c4911e686b9b5443cb0c26a4e1f769d290..8efa069caac363fed780638ba88306646690bb81 100644 --- a/port/proc.c +++ b/port/proc.c @@ -326,26 +326,35 @@ void tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms) { ulong when; - Proc *p, *f, **l, **i; + Proc *p, *f, **l; p = u->p; when = MS2TK(ms)+MACHP(0)->ticks; - i = &talarm.list; lock(&talarm); + /* take out of list if checkalarm didn't */ + if(p->trend) { + l = &talarm.list; + for(f = *l; f; f = f->tlink) { + if(f == p) { + *l = p->tlink; + break; + } + l = &f->tlink; + } + } + /* insert in increasing time order */ l = &talarm.list; - for(f = talarm.list; f; f = f->tlink) { - if(f == p) - *l = p->tlink; - if(f->twhen && f->twhen < when) - i = &f->tlink; + for(f = *l; f; f = f->tlink) { + if(f->twhen >= when) + break; l = &f->tlink; } p->trend = r; p->twhen = when; - p->tlink = *i; p->tfn = fn; - *i = p; + p->tlink = *l; + *l = p; unlock(&talarm); sleep(r, tfn, arg);