Commit Diff


commit - 815552b9ed41df2f20892f6467dd47f91f93aca1
commit + a0a331aad99bbca5a13fa4b69593061f29dc3a29
blob - 85003c29d2296f7d29ec7f074a7d5477dc130bc0
blob + 25a98d9607aa6702e85811086639a8c089d1a6f5
--- src/libthread/Linux.c
+++ src/libthread/Linux.c
@@ -32,7 +32,7 @@ _threadlock(Lock *l, int block, ulong pc)
 {
 	int i;
 static int first=1;
-if(first) {first=0; fmtinstall('T', timefmt);}
+if(first) {first=0; fmtinstall('\001', timefmt);}
 
 	USED(pc);
 
@@ -48,43 +48,43 @@ if(first) {first=0; fmtinstall('T', timefmt);}
 			return 1;
 		sched_yield();
 	}
-	/* now nice and slow */
+	/* now increasingly slow */
 	for(i=0; i<10; i++){
 		if(!_tas(&l->held))
 			return 1;
 		usleep(1);
 	}
-fprint(2, "%T lock loop %p from %lux\n", l, pc);
+fprint(2, "%\001 %s: lock loop1 %p from %lux\n", argv0, l, pc);
 	for(i=0; i<10; i++){
 		if(!_tas(&l->held))
 			return 1;
 		usleep(10);
 	}
-fprint(2, "%T lock loop %p from %lux\n", l, pc);
+fprint(2, "%\001 %s: lock loop2 %p from %lux\n", argv0, l, pc);
 	for(i=0; i<10; i++){
 		if(!_tas(&l->held))
 			return 1;
 		usleep(100);
 	}
-fprint(2, "%T lock loop %p from %lux\n", l, pc);
+fprint(2, "%\001 %s: lock loop3 %p from %lux\n", argv0, l, pc);
 	for(i=0; i<10; i++){
 		if(!_tas(&l->held))
 			return 1;
 		usleep(1000);
 	}
-fprint(2, "%T lock loop %p from %lux\n", l, pc);
+fprint(2, "%\001 %s: lock loop4 %p from %lux\n", argv0, l, pc);
 	for(i=0; i<10; i++){
 		if(!_tas(&l->held))
 			return 1;
 		usleep(10*1000);
 	}
-fprint(2, "%T lock loop %p from %lux\n", l, pc);
+fprint(2, "%\001 %s: lock loop5 %p from %lux\n", argv0, l, pc);
 	for(i=0; i<1000; i++){
 		if(!_tas(&l->held))
 			return 1;
 		usleep(100*1000);
 	}
-fprint(2, "%T lock loop %p from %lux\n", l, pc);
+fprint(2, "%\001 %s: lock loop6 %p from %lux\n", argv0, l, pc);
 	/* take your time */
 	while(_tas(&l->held))
 		usleep(1000*1000);
@@ -150,13 +150,20 @@ again:
 }
 
 void
-_procwakeup(_Procrendez *r)
+_procwakeupandunlock(_Procrendez *r)
 {
+	int pid;
+
+	pid = 0;
 	if(r->asleep){
 		r->asleep = 0;
 		assert(r->pid >= 1);
-		kill(r->pid, SIGUSR1);
+		pid = r->pid;
 	}
+	assert(r->l);
+	unlock(r->l);
+	if(pid)
+		kill(pid, SIGUSR1);
 }
 
 /*
blob - 3c408825c181163256731bac810b08c2dd5e6d18
blob + da8ec977bbd6f64da83052545f1d6b002d84862d
--- src/libthread/daemonize.c
+++ src/libthread/daemonize.c
@@ -1,3 +1,6 @@
+#include <u.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 #include "threadimpl.h"
 
 #undef waitpid
@@ -11,6 +14,7 @@ static void
 child(void)
 {
 	int status, pid;
+	struct rlimit rl;
 
 	notedisable("sys: child");
 	pid = waitpid(sigpid, &status, 0);
@@ -21,6 +25,14 @@ child(void)
 	if(WIFEXITED(status))
 		 _exit(WEXITSTATUS(status));
 	if(WIFSIGNALED(status)){
+		/*
+		 * Make sure we don't scribble over the nice
+		 * core file that our child just wrote out.
+		 */
+		rl.rlim_cur = 0;
+		rl.rlim_max = 0;
+		setrlimit(RLIMIT_CORE, &rl);
+
 		signal(WTERMSIG(status), SIG_DFL);
 		raise(WTERMSIG(status));
 		_exit(98);	/* not reached */
blob - fcc309b7b422a26d81d9231f2918ac8ffb74ed5b
blob + 38eb7d78cc07ebd507b22d0cd0208b82d2ac0796
--- src/libthread/pthread.c
+++ src/libthread/pthread.c
@@ -67,6 +67,16 @@ _procwakeup(_Procrendez *r)
 	}
 }
 
+void
+_procwakeupandunlock(_Procrendez *r)
+{
+	if(r->asleep){
+		r->asleep = 0;
+		pthread_cond_signal(&r->cond);
+	}
+	unlock(&r->l);
+}
+
 static void
 startprocfn(void *v)
 {
blob - ee73f752c352d3b658d7fd49d564f616f7fa1985
blob + 8a028aa4a227de952f8fcc00f2ad895e6974a98a
--- src/libthread/thread.c
+++ src/libthread/thread.c
@@ -166,11 +166,13 @@ _threadready(_Thread *t)
 
 	p = t->proc;
 	lock(&p->lock);
+	p->runrend.l = &p->lock;
 	addthread(&p->runqueue, t);
 //print("%d wake for job %d->%d\n", time(0), getpid(), p->osprocid);
 	if(p != proc())
-		_procwakeup(&p->runrend);
-	unlock(&p->lock);
+		_procwakeupandunlock(&p->runrend);
+	else
+		unlock(&p->lock);
 }
 
 int
blob - 6368ff5482f98fdf23e9f0015563d712af736d0f
blob + bbf847365ca56039395cdb78965c1968ef5b2670
--- src/libthread/threadimpl.h
+++ src/libthread/threadimpl.h
@@ -76,6 +76,7 @@ struct _Procrendez
 
 extern	void	_procsleep(_Procrendez*);
 extern	void	_procwakeup(_Procrendez*);
+extern	void	_procwakeupandunlock(_Procrendez*);
 
 struct Proc
 {