tclean up children more often - plan9port - [fork] Plan 9 from user space
HTML git clone git://src.adamsgaard.dk/plan9port
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
DIR commit 65de82a30f67103eb9ec1cbc9ab62725b03e7423
DIR parent f9aa99c72e86fa546a504d34ade4b3ca3164d9da
HTML Author: rsc <devnull@localhost>
Date: Wed, 9 Jun 2004 14:23:34 +0000
clean up children more often
Diffstat:
M src/libthread/sched.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
---
DIR diff --git a/src/libthread/sched.c b/src/libthread/sched.c
t@@ -25,8 +25,8 @@ _schedinit(void *arg)
{
Proc *p;
Thread *t;
- extern void ignusr1(void), _threaddie(int);
- ignusr1();
+ extern void ignusr1(int), _threaddie(int);
+ ignusr1(1);
signal(SIGTERM, _threaddie);
p = arg;
t@@ -103,7 +103,8 @@ runthread(Proc *p)
q = &p->ready;
relock:
lock(&p->readylock);
- if(q->head == nil){
+ if(p->nsched%128 == 0){
+ /* clean up children */
e = errno;
if((c = _threadwaitchan) != nil){
if(c->n <= c->s){
t@@ -131,6 +132,8 @@ relock:
free(w);
}
errno = e;
+ }
+ if(q->head == nil){
if(p->idle){
if(p->idle->state != Ready){
fprint(2, "everyone is asleep\n");
t@@ -204,6 +207,7 @@ Resched:
t->state = Running;
t->nextstate = Ready;
_gotolabel(&t->sched);
+ for(;;);
}
}