Blob


1 #include <ucontext.h>
3 typedef struct Context Context;
4 typedef struct Execjob Execjob;
5 typedef struct Proc Proc;
6 typedef struct _Procrendez _Procrendez;
8 typedef struct Jmp Jmp;
9 struct Jmp
10 {
11 p9jmp_buf b;
12 };
14 enum
15 {
16 STACK = 8192
17 };
19 struct Context
20 {
21 ucontext_t uc;
22 };
24 struct Execjob
25 {
26 int *fd;
27 char *cmd;
28 char **argv;
29 Channel *c;
30 };
32 struct _Thread
33 {
34 _Thread *next;
35 _Thread *prev;
36 _Thread *allnext;
37 _Thread *allprev;
38 Context context;
39 uint id;
40 uchar *stk;
41 uint stksize;
42 int exiting;
43 void (*startfn)(void*);
44 void *startarg;
45 Proc *proc;
46 char name[256];
47 char state[256];
48 };
50 struct _Procrendez
51 {
52 Lock *l;
53 int asleep;
54 #ifdef PLAN9PORT_USING_PTHREADS
55 pthread_cond_t cond;
56 #else
57 int pid;
58 #endif
59 };
61 extern void _procsleep(_Procrendez*);
62 extern void _procwakeup(_Procrendez*);
64 struct Proc
65 {
66 Proc *next;
67 Proc *prev;
68 char msg[128];
69 #ifdef PLAN9PORT_USING_PTHREADS
70 pthread_t osprocid;
71 #else
72 uint osprocid;
73 #endif
74 Lock lock;
75 int nswitch;
76 _Thread *thread;
77 _Threadlist runqueue;
78 _Threadlist allthreads;
79 uint nthread;
80 uint sysproc;
81 _Procrendez runrend;
82 Context schedcontext;
83 void *udata;
84 Jmp sigjmp;
85 };
87 #define proc() _threadproc()
88 #define setproc(p) _threadsetproc(p)
90 extern Proc *_threadprocs;
91 extern Lock _threadprocslock;
92 extern Proc *_threadexecproc;
93 extern Channel *_threadexecchan;
94 extern QLock _threadexeclock;
95 extern Channel *_dowaitchan;
97 extern void _procstart(Proc*, void (*fn)(Proc*));
98 extern _Thread *_threadcreate(Proc*, void(*fn)(void*), void*, uint);
99 extern void _threadexit(void);
100 extern Proc *_threadproc(void);
101 extern void _threadsetproc(Proc*);
102 extern int _threadlock(Lock*, int, ulong);
103 extern void _threadunlock(Lock*, ulong);
104 extern void _pthreadinit(void);
105 extern int _threadspawn(int*, char*, char**);
106 extern int _runthreadspawn(int*, char*, char**);
107 extern void _threadsetupdaemonize(void);
108 extern void _threaddodaemonize(char*);