more new libthread
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h
new file mode 100644
index 0000000..9f70b0e
--- /dev/null
+++ b/src/libthread/threadimpl.h
@@ -0,0 +1,70 @@
+#include <ucontext.h>
+
+typedef struct Context Context;
+typedef struct Proc Proc;
+typedef struct _Procrendez _Procrendez;
+
+enum
+{
+	STACK = 8192
+};
+
+struct Context
+{
+	ucontext_t	uc;
+};
+
+struct _Thread
+{
+	_Thread	*next;
+	_Thread	*prev;
+	_Thread	*allnext;
+	_Thread	*allprev;
+	Context	context;
+	uint	id;
+	uchar	*stk;
+	uint	stksize;
+	int		exiting;
+	void	(*startfn)(void*);
+	void	*startarg;
+	Proc	*proc;
+	char	name[256];
+	char	state[256];
+};
+
+struct _Procrendez
+{
+	Lock		*l;
+	int		asleep;
+	pthread_cond_t	cond;
+};
+
+extern	void	_procsleep(_Procrendez*);
+extern	void	_procwakeup(_Procrendez*);
+
+struct Proc
+{
+	pthread_t	tid;
+	Lock		lock;
+	_Thread		*thread;
+	_Threadlist	runqueue;
+	_Threadlist	allthreads;
+	uint		nthread;
+	uint		sysproc;
+	_Procrendez	runrend;
+	Context	schedcontext;
+	void		*udata;
+};
+
+extern Proc *xxx;
+#define proc() _threadproc()
+#define setproc(p) _threadsetproc(p)
+
+extern void _procstart(Proc*, void (*fn)(void*));
+extern _Thread *_threadcreate(Proc*, void(*fn)(void*), void*, uint);
+extern void _threadexit(void);
+extern Proc *_threadproc(void);
+extern void _threadsetproc(Proc*);
+extern int _threadlock(Lock*, int, ulong);
+extern void _threadunlock(Lock*, ulong);
+