Blob


1 #include <ucontext.h>
3 typedef struct Context Context;
4 typedef struct Proc Proc;
5 typedef struct _Procrendez _Procrendez;
7 enum
8 {
9 STACK = 8192
10 };
12 struct Context
13 {
14 ucontext_t uc;
15 };
17 struct _Thread
18 {
19 _Thread *next;
20 _Thread *prev;
21 _Thread *allnext;
22 _Thread *allprev;
23 Context context;
24 uint id;
25 uchar *stk;
26 uint stksize;
27 int exiting;
28 void (*startfn)(void*);
29 void *startarg;
30 Proc *proc;
31 char name[256];
32 char state[256];
33 };
35 struct _Procrendez
36 {
37 Lock *l;
38 int asleep;
39 pthread_cond_t cond;
40 };
42 extern void _procsleep(_Procrendez*);
43 extern void _procwakeup(_Procrendez*);
45 struct Proc
46 {
47 pthread_t tid;
48 Lock lock;
49 _Thread *thread;
50 _Threadlist runqueue;
51 _Threadlist allthreads;
52 uint nthread;
53 uint sysproc;
54 _Procrendez runrend;
55 Context schedcontext;
56 void *udata;
57 };
59 extern Proc *xxx;
60 #define proc() _threadproc()
61 #define setproc(p) _threadsetproc(p)
63 extern void _procstart(Proc*, void (*fn)(void*));
64 extern _Thread *_threadcreate(Proc*, void(*fn)(void*), void*, uint);
65 extern void _threadexit(void);
66 extern Proc *_threadproc(void);
67 extern void _threadsetproc(Proc*);
68 extern int _threadlock(Lock*, int, ulong);
69 extern void _threadunlock(Lock*, ulong);