From 615e0f9fb2df0e782f6b32ea9f0f67254e1ddeaf Mon Sep 17 00:00:00 2001 From: rsc Date: Tue, 7 Feb 2006 17:02:05 +0000 Subject: add threadidle --- src/libthread/thread.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src/libthread/thread.c') diff --git a/src/libthread/thread.c b/src/libthread/thread.c index ca4d35af..8a5643b0 100644 --- a/src/libthread/thread.c +++ b/src/libthread/thread.c @@ -207,6 +207,22 @@ _threadready(_Thread *t) unlock(&p->lock); } +int +threadidle(void) +{ + int n; + Proc *p; + + p = proc(); + n = p->nswitch; + lock(&p->lock); + p->runrend.l = &p->lock; + addthread(&p->idlequeue, p->thread); + unlock(&p->lock); + _threadswitch(); + return p->nswitch - n; +} + int threadyield(void) { @@ -255,6 +271,16 @@ procscheduler(Proc *p) while((t = p->runqueue.head) == nil){ if(p->nthread == 0) goto Out; + if((t = p->idlequeue.head) != nil){ + /* + * Run all the idling threads once. + */ + while((t = p->idlequeue.head) != nil){ + delthread(&p->idlequeue, t); + addthread(&p->runqueue, t); + } + continue; + } p->runrend.l = &p->lock; _threaddebug("scheduler sleep"); _procsleep(&p->runrend); @@ -272,7 +298,7 @@ procscheduler(Proc *p) if(t->exiting){ delthreadinproc(p, t); p->nthread--; -//print("ntrhead %d\n", p->nthread); +//print("nthread %d\n", p->nthread); free(t); } } @@ -598,7 +624,8 @@ main(int argc, char **argv) argv0 = argv[0]; - _threadsetupdaemonize(); + if(getenv("NOLIBTHREADDAEMONIZE") == nil) + _threadsetupdaemonize(); threadargc = argc; threadargv = argv; -- cgit v1.2.3