more tests
diff --git a/src/libthread/test/rdaemon.c b/src/libthread/test/rdaemon.c
new file mode 100644
index 0000000..dcb7727
--- /dev/null
+++ b/src/libthread/test/rdaemon.c
@@ -0,0 +1,96 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <pthread.h>
+
+#undef waitpid
+#undef pipe
+#undef wait
+
+static int sigpid;
+static void
+sigenable(int sig, int enabled)
+{
+	sigset_t mask;
+	sigemptyset(&mask);
+	sigaddset(&mask, sig);
+	sigprocmask(enabled ? SIG_UNBLOCK : SIG_BLOCK, &mask, 0);
+}
+
+static void
+child(void)
+{
+	int status, pid;
+printf("wait %d in %d\n", sigpid, getpid());
+	pid = waitpid(sigpid, &status, __WALL);
+	if(pid < 0)
+		perror("wait");
+	else if(WIFEXITED(status))
+		 _exit(WEXITSTATUS(status));
+printf("pid %d if %d %d\n", pid, WIFEXITED(status), WEXITSTATUS(status));
+	_exit(97);
+}
+
+static void
+sigpass(int sig)
+{
+	if(sig == SIGCHLD){
+print("sig\n");
+		child();
+	}else
+		kill(sigpid, sig);
+}
+
+void
+_threadsetupdaemonize(void)
+{
+	int i, n, pid;
+	int p[2];
+	char buf[20];
+
+	sigpid = 1;
+
+	if(pipe(p) < 0)
+		abort();
+
+	signal(SIGCHLD, sigpass);
+	switch(pid = fork()){
+	case -1:
+		abort();
+	default:
+		close(p[1]);
+		break;
+	case 0:
+		close(p[0]);
+		return;
+	}
+
+	sigpid = pid;
+
+	read(p[0], buf, sizeof buf-1);
+print("pipe\n");
+	child();
+}
+
+void*
+sleeper(void *v)
+{
+	pthread_mutex_t m;
+	pthread_cond_t c;
+
+	pthread_mutex_init(&m, 0);
+	pthread_cond_init(&c, 0);
+	pthread_cond_wait(&c, &m);
+	return 0;
+}
+
+void
+main(int argc, char **argv)
+{
+	pthread_t pid;
+
+	_threadsetupdaemonize();
+	pthread_create(&pid, 0, sleeper, 0);
+	exit(1);
+}
diff --git a/src/libthread/test/tdaemon.c b/src/libthread/test/tdaemon.c
index 5ac9768..d492c48 100644
--- a/src/libthread/test/tdaemon.c
+++ b/src/libthread/test/tdaemon.c
@@ -3,9 +3,14 @@
 #include <thread.h>
 
 void
-threadmain(int argc, char **argv)
+proc(void *v)
 {
-	threaddaemonize();
 	sleep(5*1000);
 	print("still running\n");
 }
+
+void
+threadmain(int argc, char **argv)
+{
+	proccreate(proc, nil, 32768);
+}
diff --git a/src/libthread/test/texit.c b/src/libthread/test/texit.c
new file mode 100644
index 0000000..fc2ebb5
--- /dev/null
+++ b/src/libthread/test/texit.c
@@ -0,0 +1,18 @@
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+
+void
+f(void *v)
+{
+	USED(v);
+
+	recvp(chancreate(sizeof(void*), 0));
+}
+
+void
+threadmain(int argc, char **argv)
+{
+	proccreate(f, nil, 32000);
+	exit(1);
+}
diff --git a/src/libthread/test/tprimes.c b/src/libthread/test/tprimes.c
index 8fcfa2e..5674498 100644
--- a/src/libthread/test/tprimes.c
+++ b/src/libthread/test/tprimes.c
@@ -9,6 +9,7 @@
 
 int max = 10000;
 int (*mk)(void (*fn)(void*), void *arg, uint stack);
+void printmsg(void*, char*);
 
 void
 countthread(void *v)
@@ -55,6 +56,7 @@
 	Channel *c;
 	int nbuf;
 
+	notify(printmsg);
 	nbuf = 0;
 	mk = threadcreate;
 	ARGBEGIN{
@@ -79,3 +81,9 @@
 	mk(filterthread, c, STACK);
 	recvp(chancreate(sizeof(void*), 0));
 }
+
+void
+printmsg(void *v, char *msg)
+{
+	print("note: %s\n", msg);
+}
diff --git a/src/libthread/test/tspawnloop.c b/src/libthread/test/tspawnloop.c
index 8835267..05636dc 100644
--- a/src/libthread/test/tspawnloop.c
+++ b/src/libthread/test/tspawnloop.c
@@ -18,7 +18,7 @@
 	args[2] = nil;
 	threadexec(nil, fd, args[0], args);
 }
-	
+
 void
 threadmain(int argc, char **argv)
 {