shuffle to allow use of execchan in non-pthreads impls
diff --git a/src/libthread/exec.c b/src/libthread/exec.c
index 2cbb443..f31b004 100644
--- a/src/libthread/exec.c
+++ b/src/libthread/exec.c
@@ -7,17 +7,22 @@
 static Lock thewaitlock;
 static Channel *thewaitchan;
 static Channel *dowaitchan;
+static Channel *execchan;
 
-/* BUG - start waitproc on first exec, not when threadwaitchan is called */
 static void
 waitproc(void *v)
 {
 	Channel *c;
 	Waitmsg *w;
+	Execjob *e;
 
 	_threadsetsysproc();
 	for(;;){
-		while((w = wait()) == nil){
+		for(;;){
+			while((e = nbrecvp(execchan)) != nil)
+				sendul(e->c, _threadspawn(e->fd, e->cmd, e->argv));
+			if((w = wait()) != nil)
+				break;
 			if(errno == ECHILD)
 				recvul(dowaitchan);
 		}
@@ -40,15 +45,12 @@
 	}
 	thewaitchan = chancreate(sizeof(Waitmsg*), 4);
 	chansetname(thewaitchan, "threadwaitchan");
-	dowaitchan = chancreate(sizeof(ulong), 1);
-	chansetname(dowaitchan, "dowaitchan");
-	proccreate(waitproc, nil, STACK);
 	unlock(&thewaitlock);
 	return thewaitchan;
 }
 
 int
-threadspawn(int fd[3], char *cmd, char *argv[])
+_threadspawn(int fd[3], char *cmd, char *argv[])
 {
 	int i, n, p[2], pid;
 	char exitstr[100];
@@ -97,6 +99,24 @@
 }
 
 int
+threadspawn(int fd[3], char *cmd, char *argv[])
+{
+	if(dowaitchan == nil){
+		lock(&thewaitlock);
+		if(dowaitchan == nil){
+			dowaitchan = chancreate(sizeof(ulong), 1);
+			chansetname(dowaitchan, "dowaitchan");
+			execchan = chancreate(sizeof(void*), 0);
+			chansetname(execchan, "execchan");
+			proccreate(waitproc, nil, STACK);
+		}
+		unlock(&thewaitlock);
+	}
+	return _runthreadspawn(fd, cmd, argv);
+}
+
+
+int
 _threadexec(Channel *cpid, int fd[3], char *cmd, char *argv[])
 {
 	int pid;
diff --git a/src/libthread/pthread.c b/src/libthread/pthread.c
index 2ddd8c7..e1fed2b 100644
--- a/src/libthread/pthread.c
+++ b/src/libthread/pthread.c
@@ -130,3 +130,9 @@
 	pthread_key_create(&prockey, 0);
 }
 
+int
+_runthreadspawn(int *fd, char *cmd, char **argv)
+{
+	return _threadspawn(fd, cmd, argv);
+}
+
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h
index d30d58b..9f0a53d 100644
--- a/src/libthread/threadimpl.h
+++ b/src/libthread/threadimpl.h
@@ -1,6 +1,7 @@
 #include <ucontext.h>
 
 typedef struct Context Context;
+typedef struct Execjob Execjob;
 typedef struct Proc Proc;
 typedef struct _Procrendez _Procrendez;
 
@@ -20,6 +21,14 @@
 	ucontext_t	uc;
 };
 
+struct Execjob
+{
+	int *fd;
+	char *cmd;
+	char **argv;
+	Channel *c;
+};
+
 struct _Thread
 {
 	_Thread	*next;
@@ -88,3 +97,5 @@
 extern int _threadlock(Lock*, int, ulong);
 extern void _threadunlock(Lock*, ulong);
 extern void _pthreadinit(void);
+extern int _threadspawn(int*, char*, char**);
+extern int _runthreadspawn(int*, char*, char**);