From e97ceade5e1bba5787e39429384336fa37797906 Mon Sep 17 00:00:00 2001 From: rsc Date: Sat, 6 Dec 2003 18:05:27 +0000 Subject: various tweaks. --- src/libthread/sched.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/libthread/sched.c') diff --git a/src/libthread/sched.c b/src/libthread/sched.c index 293e3306..d6af1c7c 100644 --- a/src/libthread/sched.c +++ b/src/libthread/sched.c @@ -93,12 +93,21 @@ runthread(Proc *p) Thread *t; Tqueue *q; - if(p->nthreads==0) + if(p->nthreads==0 || (p->nthreads==1 && p->idle)) return nil; q = &p->ready; lock(&p->readylock); if(q->head == nil){ q->asleep = 1; + if(p->idle){ + if(p->idle->state != Ready){ + fprint(2, "everyone is asleep\n"); + exits("everyone is asleep"); + } + unlock(&p->readylock); + return p->idle; + } + _threaddebug(DBGSCHED, "sleeping for more work (%d threads)", p->nthreads); unlock(&p->readylock); while(rendezvous((ulong)q, 0) == ~0){ @@ -167,6 +176,9 @@ _threadready(Thread *t) { Tqueue *q; + if(t == t->proc->idle) + return; + assert(t->state == Ready); _threaddebug(DBGSCHED, "readying %d.%d", t->proc->pid, t->id); q = &t->proc->ready; @@ -190,6 +202,25 @@ _threadready(Thread *t) unlock(&t->proc->readylock); } +void +_threadidle(void) +{ + Tqueue *q; + Thread *t; + Proc *p; + + p = _threadgetproc(); + q = &p->ready; + lock(&p->readylock); + assert(q->head); + t = q->head; + q->head = t->next; + if(q->tail == t) + q->tail = nil; + p->idle = t; + unlock(&p->readylock); +} + void yield(void) { -- cgit v1.2.3