blob: 0334fe30df96f9f64b566f751f3462f23d4c323a [file] [log] [blame]
rscd54ead72004-12-28 04:20:39 +00001#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>
rsc619085f2004-12-25 21:57:50 +00008#include <ucontext.h>
rscd54ead72004-12-28 04:20:39 +00009#include "libc.h"
10#include "thread.h"
11
wkj0debe1c2004-12-29 01:29:42 +000012#if defined(__FreeBSD__) && __FreeBSD_version < 500000
rscd54ead72004-12-28 04:20:39 +000013extern int getcontext(ucontext_t*);
14extern void setcontext(ucontext_t*);
15extern int swapcontext(ucontext_t*, ucontext_t*);
16extern void makecontext(ucontext_t*, void(*)(), int, ...);
17#endif
rsc619085f2004-12-25 21:57:50 +000018
rsc50f7ec32005-01-07 21:47:30 +000019#if defined(__APPLE__)
20# include "Darwin-ucontext.h"
21#endif
22
rsc619085f2004-12-25 21:57:50 +000023typedef struct Context Context;
rsce127e402004-12-27 17:19:44 +000024typedef struct Execjob Execjob;
rsc619085f2004-12-25 21:57:50 +000025typedef struct Proc Proc;
26typedef struct _Procrendez _Procrendez;
27
rsce1dc7e42004-12-27 00:13:48 +000028typedef struct Jmp Jmp;
29struct Jmp
30{
31 p9jmp_buf b;
32};
33
rsc619085f2004-12-25 21:57:50 +000034enum
35{
36 STACK = 8192
37};
38
39struct Context
40{
41 ucontext_t uc;
42};
43
rsce127e402004-12-27 17:19:44 +000044struct Execjob
45{
46 int *fd;
47 char *cmd;
48 char **argv;
49 Channel *c;
50};
51
rsc619085f2004-12-25 21:57:50 +000052struct _Thread
53{
54 _Thread *next;
55 _Thread *prev;
56 _Thread *allnext;
57 _Thread *allprev;
58 Context context;
59 uint id;
60 uchar *stk;
61 uint stksize;
62 int exiting;
63 void (*startfn)(void*);
64 void *startarg;
65 Proc *proc;
66 char name[256];
67 char state[256];
68};
69
70struct _Procrendez
71{
72 Lock *l;
73 int asleep;
rsc4dbefdd2004-12-27 16:52:26 +000074#ifdef PLAN9PORT_USING_PTHREADS
rsc619085f2004-12-25 21:57:50 +000075 pthread_cond_t cond;
rsc4dbefdd2004-12-27 16:52:26 +000076#else
77 int pid;
78#endif
rsc619085f2004-12-25 21:57:50 +000079};
80
81extern void _procsleep(_Procrendez*);
82extern void _procwakeup(_Procrendez*);
rsca0a331a2005-01-06 23:43:42 +000083extern void _procwakeupandunlock(_Procrendez*);
rsc619085f2004-12-25 21:57:50 +000084
85struct Proc
86{
rsc4dbefdd2004-12-27 16:52:26 +000087 Proc *next;
88 Proc *prev;
89 char msg[128];
90#ifdef PLAN9PORT_USING_PTHREADS
91 pthread_t osprocid;
92#else
93 uint osprocid;
94#endif
rsc619085f2004-12-25 21:57:50 +000095 Lock lock;
rsc8cbd8542004-12-27 19:11:33 +000096 int nswitch;
rsc619085f2004-12-25 21:57:50 +000097 _Thread *thread;
98 _Threadlist runqueue;
99 _Threadlist allthreads;
100 uint nthread;
101 uint sysproc;
102 _Procrendez runrend;
103 Context schedcontext;
104 void *udata;
rsce1dc7e42004-12-27 00:13:48 +0000105 Jmp sigjmp;
rsc619085f2004-12-25 21:57:50 +0000106};
107
rsc619085f2004-12-25 21:57:50 +0000108#define proc() _threadproc()
109#define setproc(p) _threadsetproc(p)
110
rsc4dbefdd2004-12-27 16:52:26 +0000111extern Proc *_threadprocs;
112extern Lock _threadprocslock;
rsc955a2ca2004-12-27 18:21:58 +0000113extern Proc *_threadexecproc;
114extern Channel *_threadexecchan;
115extern QLock _threadexeclock;
116extern Channel *_dowaitchan;
rsc4dbefdd2004-12-27 16:52:26 +0000117
rsc73722a82004-12-27 03:49:03 +0000118extern void _procstart(Proc*, void (*fn)(Proc*));
rsc619085f2004-12-25 21:57:50 +0000119extern _Thread *_threadcreate(Proc*, void(*fn)(void*), void*, uint);
120extern void _threadexit(void);
121extern Proc *_threadproc(void);
122extern void _threadsetproc(Proc*);
123extern int _threadlock(Lock*, int, ulong);
124extern void _threadunlock(Lock*, ulong);
rsce1dc7e42004-12-27 00:13:48 +0000125extern void _pthreadinit(void);
rsce127e402004-12-27 17:19:44 +0000126extern int _threadspawn(int*, char*, char**);
127extern int _runthreadspawn(int*, char*, char**);
rsc2c87dda2004-12-28 01:35:38 +0000128extern void _threadsetupdaemonize(void);
129extern void _threaddodaemonize(char*);
rsc1d2533d2004-12-28 22:36:24 +0000130extern void _threadpexit(void);
rscc7acb532005-01-04 22:23:24 +0000131extern void _threaddaemonize(void);