Commit Diff


commit - f9aa99c72e86fa546a504d34ade4b3ca3164d9da
commit + 65de82a30f67103eb9ec1cbc9ab62725b03e7423
blob - bdb9ad6b21c9c2957eecf76af1679905c83fe9f5
blob + cfc76d677d87cc52e62d79ee94cec7b9422d2ae7
--- src/libthread/sched.c
+++ src/libthread/sched.c
@@ -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;
@@ -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){
@@ -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");
@@ -204,6 +207,7 @@ Resched:
 		t->state = Running;
 		t->nextstate = Ready;
 		_gotolabel(&t->sched);
+		for(;;);
 	}
 }