From 7069bd0a68052fb04825a7cd8679a5d0ebbd0cdb Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 20 Apr 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-04-20 --- port/proc.c | 49 ++++++++++++++++++++++++++++++++----------------- port/stream.c | 4 +++- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/port/proc.c b/port/proc.c index 022797ac0dfeafea5f612fae557a6eee8751496d..1fbd92d1ce8538daa0082e7018b0e30d006f3cd8 100644 --- a/port/proc.c +++ b/port/proc.c @@ -18,12 +18,14 @@ struct Proc *free; }procalloc; -struct +typedef struct { Lock; Proc *head; Proc *tail; -}runq; +}Schedq; + +Schedq runhiq, runloq; char *statename[]={ /* BUG: generate automatically */ "Dead", @@ -75,7 +77,7 @@ schedinit(void) /* never returns */ void sched(void) { - uchar procstate[64]; /* sleeze for portability */ + uchar procstate[64]; /* sleaze for portability */ Proc *p; ulong tlbvirt, tlbphys; void (*f)(ulong, ulong); @@ -104,24 +106,31 @@ sched(void) int anyready(void) { - return runq.head != 0; + return runloq.head != 0 || runhiq.head != 0; } void ready(Proc *p) { + Schedq *rq; int s; s = splhi(); - lock(&runq); + if(p->state == Running) + rq = &runloq; + else + rq = &runhiq; + + lock(&runhiq); p->rnext = 0; - if(runq.tail) - runq.tail->rnext = p; + if(rq->tail) + rq->tail->rnext = p; else - runq.head = p; - runq.tail = p; + rq->head = p; + rq->tail = p; + p->state = Ready; - unlock(&runq); + unlock(&runhiq); splx(s); } @@ -131,27 +140,33 @@ ready(Proc *p) Proc* runproc(void) { + Schedq *rq; Proc *p; int i; loop: - while(runq.head == 0) + while(runhiq.head==0 && runloq.head==0) for(i=0; i<10; i++) /* keep out of shared memory for a while */ ; splhi(); - lock(&runq); - p = runq.head; + lock(&runhiq); + if(runhiq.head) + rq = &runhiq; + else + rq = &runloq; + + p = rq->head; if(p==0 || p->mach){ /* p->mach==0 only when process state is saved */ - unlock(&runq); + unlock(&runhiq); spllo(); goto loop; } if(p->rnext == 0) - runq.tail = 0; - runq.head = p->rnext; + rq->tail = 0; + rq->head = p->rnext; if(p->state != Ready) print("runproc %s %d %s\n", p->text, p->pid, statename[p->state]); - unlock(&runq); + unlock(&runhiq); p->state = Scheding; spllo(); return p; diff --git a/port/stream.c b/port/stream.c index 544c8edf0cf2ddaa2ff99022408c5c740cd6649b..360dc7a5fd608bc70b730a2ddef3a2e7c8a03564 100644 --- a/port/stream.c +++ b/port/stream.c @@ -241,15 +241,17 @@ allocb(ulong size) void freeb(Block *bp) { + ulong mark[1]; Block *nbp; Bclass *bcp; int x; if((bp->flags&S_CLASS) >= Nclass) panic("freeb class"); + for(; bp; bp = nbp){ bcp = &bclass[bp->flags & S_CLASS]; - bp->flags = S_CLASS; /* Check for doulbe free */ + bp->flags = bp->flags|S_CLASS; /* Check for doulbe free */ lock(bcp); bp->rptr = bp->wptr = 0; if(bcp->first)