#include typedef struct Context Context; typedef struct Proc Proc; typedef struct _Procrendez _Procrendez; typedef struct Jmp Jmp; struct Jmp { p9jmp_buf b; }; 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; Jmp sigjmp; }; extern Proc *xxx; #define proc() _threadproc() #define setproc(p) _threadsetproc(p) extern void _procstart(Proc*, void (*fn)(Proc*)); 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); extern void _pthreadinit(void);