Blob


1 #include "u.h"
2 #include <errno.h>
3 #include <sys/time.h>
4 #include <sys/types.h>
5 #include <sys/wait.h>
6 #include <sched.h>
7 #include <signal.h>
8 #if !defined(__OpenBSD__)
9 # if defined(__APPLE__)
10 # define _XOPEN_SOURCE /* for Snow Leopard */
11 # endif
12 #endif
13 #include <sys/utsname.h>
14 #include "libc.h"
15 #include "thread.h"
17 typedef struct Execjob Execjob;
18 typedef struct Proc Proc;
19 typedef struct _Procrendez _Procrendez;
21 typedef struct Jmp Jmp;
22 struct Jmp
23 {
24 p9jmp_buf b;
25 };
27 enum
28 {
29 STACK = 8192
30 };
32 struct Execjob
33 {
34 int *fd;
35 char *cmd;
36 char **argv;
37 char *dir;
38 Channel *c;
39 };
41 struct _Procrendez
42 {
43 Lock *l;
44 int asleep;
45 pthread_cond_t cond;
46 };
48 struct _Thread
49 {
50 _Thread *next;
51 _Thread *prev;
52 _Thread *allnext;
53 _Thread *allprev;
54 void (*startfn)(void*);
55 void *startarg;
56 uint id;
57 pthread_t osprocid;
58 uchar *stk;
59 uint stksize;
60 int exiting;
61 int mainthread;
62 Proc *proc;
63 char name[256];
64 char state[256];
65 void *udata;
66 Alt *alt;
67 _Procrendez schedrend;
68 };
70 extern void _procsleep(_Procrendez*);
71 extern void _procwakeup(_Procrendez*);
72 extern void _procwakeupandunlock(_Procrendez*);
74 struct Proc
75 {
76 Proc *next;
77 Proc *prev;
78 char msg[128];
79 pthread_t osprocid;
80 Lock lock;
81 int nswitch;
82 _Thread *thread0;
83 _Thread *thread;
84 _Thread *pinthread;
85 _Threadlist runqueue;
86 _Threadlist idlequeue;
87 _Threadlist allthreads;
88 uint nthread;
89 uint sysproc;
90 _Procrendez runrend;
91 _Thread *schedthread;
92 void *udata;
93 Jmp sigjmp;
94 int mainproc;
95 };
97 #define proc() _threadproc()
99 extern Proc *_threadprocs;
100 extern Lock _threadprocslock;
101 extern Proc *_threadexecproc;
102 extern Channel *_threadexecchan;
103 extern QLock _threadexeclock;
104 extern Channel *_dowaitchan;
106 extern void _procstart(Proc*, void (*fn)(Proc*));
107 extern _Thread *_threadcreate(Proc*, void(*fn)(void*), void*, uint);
108 extern void _procexit(void);
109 extern Proc *_threadproc(void);
110 extern void _threadsetproc(Proc*);
111 extern int _threadlock(Lock*, int, ulong);
112 extern void _threadunlock(Lock*, ulong);
113 extern void _pthreadinit(void);
114 extern int _threadspawn(int*, char*, char**, char*);
115 extern int _runthreadspawn(int*, char*, char**, char*);
116 extern void _threadsetupdaemonize(void);
117 extern void _threaddodaemonize(char*);
118 extern void _threadpexit(void);
119 extern void _threaddaemonize(void);
120 extern void *_threadstkalloc(int);
121 extern void _threadstkfree(void*, int);
122 extern void _threadpthreadmain(Proc*, _Thread*);
123 extern void _threadpthreadstart(Proc*, _Thread*);
125 #define USPALIGN(ucp, align) \
126 (void*)((((uintptr)(ucp)->uc_stack.ss_sp+(ucp)->uc_stack.ss_size)-(align))&~((align)-1))