aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/thread.h1
-rw-r--r--src/libthread/thread.c31
-rw-r--r--src/libthread/threadimpl.h1
3 files changed, 31 insertions, 2 deletions
diff --git a/include/thread.h b/include/thread.h
index 9424d37e..94c99a25 100644
--- a/include/thread.h
+++ b/include/thread.h
@@ -17,6 +17,7 @@ void threadsetname(char*, ...);
void threadsetstate(char*, ...);
char *threadgetname(void);
int threadyield(void);
+int threadidle(void);
void _threadready(_Thread*);
void _threadswitch(void);
void _threadsetsysproc(void);
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
@@ -208,6 +208,22 @@ _threadready(_Thread *t)
}
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)
{
int n;
@@ -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;
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h
index 33644657..d1f3e938 100644
--- a/src/libthread/threadimpl.h
+++ b/src/libthread/threadimpl.h
@@ -126,6 +126,7 @@ struct Proc
int nswitch;
_Thread *thread;
_Threadlist runqueue;
+ _Threadlist idlequeue;
_Threadlist allthreads;
uint nthread;
uint sysproc;