confine pthreads to pthread.c
diff --git a/src/libthread/channel.c b/src/libthread/channel.c
index 3c9614e..c8c9679 100644
--- a/src/libthread/channel.c
+++ b/src/libthread/channel.c
@@ -22,6 +22,8 @@
 	Channel *c;
 
 	c = malloc(sizeof *c+bufsize*elemsize);
+	if(c == nil)
+		sysfatal("chancreate malloc: %r");
 	memset(c, 0, sizeof *c);
 	c->elemsize = elemsize;
 	c->bufsize = bufsize;
diff --git a/src/libthread/pthread.c b/src/libthread/pthread.c
index 8ca8f8f..6540605 100644
--- a/src/libthread/pthread.c
+++ b/src/libthread/pthread.c
@@ -71,16 +71,40 @@
 	}
 }
 
-void
-_procstart(Proc *p, void (*fn)(void*))
+static void
+startprocfn(void *v)
 {
-//print("pc\n");
-	if(pthread_create(&p->tid, nil, (void*(*)(void*))fn, p) < 0){
-//print("pc1\n");
+	void **a;
+	void (*fn)(void*);
+	Proc *p;
+
+	a = (void**)v;
+	fn = a[0];
+	p = a[1];
+	free(a);
+	p->tid = pthread_self();
+	pthread_detach(p->tid);
+
+	(*fn)(p);
+
+	pthread_exit(0);
+}
+
+void
+_procstart(Proc *p, void (*fn)(Proc*))
+{
+	void **a;
+
+	a = malloc(2*sizeof a[0]);
+	if(a == nil)
+		sysfatal("_procstart malloc: %r");
+	a[0] = fn;
+	a[1] = p;
+
+	if(pthread_create(&p->tid, nil, (void*(*)(void*))startprocfn, (void*)a) < 0){
 		fprint(2, "pthread_create: %r\n");
 		abort();
 	}
-//print("pc2\n");
 }
 
 static pthread_key_t prockey;
diff --git a/src/libthread/thread.c b/src/libthread/thread.c
index 4d02bcb..158f6e9 100644
--- a/src/libthread/thread.c
+++ b/src/libthread/thread.c
@@ -18,7 +18,7 @@
 static	void		addthreadinproc(Proc*, _Thread*);
 static	void		delthreadinproc(Proc*, _Thread*);
 static	void		contextswitch(Context *from, Context *to);
-static	void		scheduler(void*);
+static	void		scheduler(Proc*);
 
 static _Thread*
 getthreadnow(void)
@@ -33,6 +33,8 @@
 	Proc *p;
 
 	p = malloc(sizeof *p);
+	if(p == nil)
+		sysfatal("procalloc malloc: %r");
 	memset(p, 0, sizeof *p);
 	lock(&threadnproclock);
 	threadnproc++;
@@ -58,6 +60,8 @@
 
 	/* allocate the task and stack together */
 	t = malloc(sizeof *t+stack);
+	if(t == nil)
+		sysfatal("threadalloc malloc: %r");
 	memset(t, 0, sizeof *t);
 	t->stk = (uchar*)(t+1);
 	t->stksize = stack;
@@ -183,16 +187,12 @@
 }
 
 static void
-scheduler(void *v)
+scheduler(Proc *p)
 {
 	_Thread *t;
-	Proc *p;
 
-	p = v;
 	setproc(p);
 	// print("s %p %d\n", p, gettid());
-	p->tid = pthread_self();
-	pthread_detach(p->tid);
 	lock(&p->lock);
 	for(;;){
 		while((t = p->runqueue.head) == nil){
@@ -225,7 +225,6 @@
 	unlock(&p->lock);
 	free(p);
 	setproc(0);
-	pthread_exit(nil);
 }
 
 void
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h
index fb7e4c3..e88e321 100644
--- a/src/libthread/threadimpl.h
+++ b/src/libthread/threadimpl.h
@@ -67,7 +67,7 @@
 #define proc() _threadproc()
 #define setproc(p) _threadsetproc(p)
 
-extern void _procstart(Proc*, void (*fn)(void*));
+extern void _procstart(Proc*, void (*fn)(Proc*));
 extern _Thread *_threadcreate(Proc*, void(*fn)(void*), void*, uint);
 extern void _threadexit(void);
 extern Proc *_threadproc(void);