add _procwakeupandunlock
to help ease locking contention
on Linux 2.4.
diff --git a/src/libthread/Linux.c b/src/libthread/Linux.c
index 85003c2..25a98d9 100644
--- a/src/libthread/Linux.c
+++ b/src/libthread/Linux.c
@@ -32,7 +32,7 @@
 {
 	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 @@
 			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 @@
 }
 
 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);
 }
 
 /*
diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c
index 3c40882..da8ec97 100644
--- a/src/libthread/daemonize.c
+++ b/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 @@
 child(void)
 {
 	int status, pid;
+	struct rlimit rl;
 
 	notedisable("sys: child");
 	pid = waitpid(sigpid, &status, 0);
@@ -21,6 +25,14 @@
 	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 */
diff --git a/src/libthread/pthread.c b/src/libthread/pthread.c
index fcc309b..38eb7d7 100644
--- a/src/libthread/pthread.c
+++ b/src/libthread/pthread.c
@@ -67,6 +67,16 @@
 	}
 }
 
+void
+_procwakeupandunlock(_Procrendez *r)
+{
+	if(r->asleep){
+		r->asleep = 0;
+		pthread_cond_signal(&r->cond);
+	}
+	unlock(&r->l);
+}
+
 static void
 startprocfn(void *v)
 {
diff --git a/src/libthread/thread.c b/src/libthread/thread.c
index ee73f75..8a028aa 100644
--- a/src/libthread/thread.c
+++ b/src/libthread/thread.c
@@ -166,11 +166,13 @@
 
 	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
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h
index 6368ff5..bbf8473 100644
--- a/src/libthread/threadimpl.h
+++ b/src/libthread/threadimpl.h
@@ -76,6 +76,7 @@
 
 extern	void	_procsleep(_Procrendez*);
 extern	void	_procwakeup(_Procrendez*);
+extern	void	_procwakeupandunlock(_Procrendez*);
 
 struct Proc
 {