tthread.h - plan9port - [fork] Plan 9 from user space | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
tthread.h (4069B) | |
--- | |
1 #ifndef _THREAD_H_ | |
2 #define _THREAD_H_ 1 | |
3 #if defined(__cplusplus) | |
4 extern "C" { | |
5 #endif | |
6 | |
7 AUTOLIB(thread) | |
8 | |
9 /* | |
10 * basic procs and threads | |
11 */ | |
12 int proccreate(void (*f)(void *arg), void *arg, unsigned … | |
13 int threadcreate(void (*f)(void *arg), void *arg, unsigne… | |
14 void threadexits(char *); | |
15 void threadexitsall(char *); | |
16 void threadsetname(char*, ...); | |
17 void threadsetstate(char*, ...); | |
18 void threadneedbackground(void); | |
19 char *threadgetname(void); | |
20 int threadyield(void); | |
21 int threadidle(void); | |
22 void _threadready(_Thread*); | |
23 void _threadswitch(void); | |
24 void _threadsetsysproc(void); | |
25 void _threadsleep(Rendez*); | |
26 _Thread *_threadwakeup(Rendez*); | |
27 #define yield threadyield | |
28 int threadid(void); | |
29 void _threadpin(void); | |
30 void _threadunpin(void); | |
31 | |
32 /* | |
33 * I am tired of making this mistake. | |
34 */ | |
35 #define exits do_not_call_exits_in_threaded_programs | |
36 #define _exits do_not_call__exits_in_threaded_programs | |
37 | |
38 | |
39 | |
40 /* | |
41 * signals | |
42 */ | |
43 void threadnotify(int(*f)(void*,char*), int); | |
44 | |
45 /* | |
46 * daemonize | |
47 * | |
48 void threaddaemonize(void); | |
49 */ | |
50 | |
51 /* | |
52 * per proc and thread data | |
53 */ | |
54 void **procdata(void); | |
55 void **threaddata(void); | |
56 | |
57 /* | |
58 * supplied by user instead of main. | |
59 * mainstacksize is size of stack allocated to run threadmain | |
60 */ | |
61 void threadmain(int argc, char *argv[]); | |
62 extern int mainstacksize; | |
63 | |
64 int threadmaybackground(void); | |
65 | |
66 /* | |
67 * channel communication | |
68 */ | |
69 typedef struct Alt Alt; | |
70 typedef struct _Altarray _Altarray; | |
71 typedef struct Channel Channel; | |
72 | |
73 enum | |
74 { | |
75 CHANEND, | |
76 CHANSND, | |
77 CHANRCV, | |
78 CHANNOP, | |
79 CHANNOBLK | |
80 }; | |
81 | |
82 struct Alt | |
83 { | |
84 Channel *c; | |
85 void *v; | |
86 uint op; | |
87 _Thread *thread; | |
88 }; | |
89 | |
90 struct _Altarray | |
91 { | |
92 Alt **a; | |
93 uint n; | |
94 uint m; | |
95 }; | |
96 | |
97 struct Channel | |
98 { | |
99 uint bufsize; | |
100 uint elemsize; | |
101 uchar *buf; | |
102 uint nbuf; | |
103 uint off; | |
104 _Altarray asend; | |
105 _Altarray arecv; | |
106 char *name; | |
107 }; | |
108 | |
109 /* [Edit .+1,./^$/ |cfn -h $PLAN9/src/libthread/channel.c] */ | |
110 int chanalt(Alt *alts); | |
111 Channel* chancreate(int elemsize, int elemcnt); | |
112 void chanfree(Channel *c); | |
113 int channbrecv(Channel *c, void *v); | |
114 void* channbrecvp(Channel *c); | |
115 ulong channbrecvul(Channel *c); | |
116 int channbsend(Channel *c, void *v); | |
117 int channbsendp(Channel *c, void *v); | |
118 int channbsendul(Channel *c, ulong v); | |
119 int chanrecv(Channel *c, void *v); | |
120 void* chanrecvp(Channel *c); | |
121 ulong chanrecvul(Channel *c); | |
122 int chansend(Channel *c, void *v); | |
123 int chansendp(Channel *c, void *v); | |
124 int chansendul(Channel *c, ulong v); | |
125 void chansetname(Channel *c, char *fmt, ...); | |
126 | |
127 #define alt chanalt | |
128 #define nbrecv channbrecv | |
129 #define nbrecvp channbrecvp | |
130 #define nbrecvul channbrecvul | |
131 #define nbsend channbsend | |
132 #define nbsendp channbsendp | |
133 #define nbsendul channbsendul | |
134 #define recv chanrecv | |
135 #define recvp chanrecvp | |
136 #define recvul chanrecvul | |
137 #define send chansend | |
138 #define sendp chansendp | |
139 #define sendul chansendul | |
140 | |
141 /* | |
142 * reference counts | |
143 */ | |
144 typedef struct Ref Ref; | |
145 | |
146 struct Ref { | |
147 Lock lock; | |
148 long ref; | |
149 }; | |
150 | |
151 long decref(Ref *r); | |
152 long incref(Ref *r); | |
153 | |
154 /* | |
155 * slave i/o processes | |
156 */ | |
157 typedef struct Ioproc Ioproc; | |
158 | |
159 /* [Edit .+1,/^$/ |cfn -h $PLAN9/src/libthread/io*.c] */ | |
160 void closeioproc(Ioproc *io); | |
161 long iocall(Ioproc *io, long (*op)(va_list*), ...); | |
162 int ioclose(Ioproc *io, int fd); | |
163 int iodial(Ioproc *io, char *addr, char *local, char *dir… | |
164 void iointerrupt(Ioproc *io); | |
165 int ioopen(Ioproc *io, char *path, int mode); | |
166 Ioproc* ioproc(void); | |
167 long ioread(Ioproc *io, int fd, void *a, long n); | |
168 int ioread9pmsg(Ioproc*, int, void*, int); | |
169 long ioreadn(Ioproc *io, int fd, void *a, long n); | |
170 int iorecvfd(Ioproc *, int); | |
171 int iosendfd(Ioproc*, int, int); | |
172 int iosleep(Ioproc *io, long n); | |
173 long iowrite(Ioproc *io, int fd, void *a, long n); | |
174 | |
175 /* | |
176 * exec external programs | |
177 */ | |
178 void threadexec(Channel*, int[3], char*, char *[]); | |
179 void threadexecl(Channel*, int[3], char*, ...); | |
180 int threadspawn(int[3], char*, char*[]); | |
181 int threadspawnd(int[3], char*, char*[], char*); | |
182 int threadspawnl(int[3], char*, ...); | |
183 Channel* threadwaitchan(void); | |
184 | |
185 /* | |
186 * alternate interface to threadwaitchan - don't use both! | |
187 */ | |
188 Waitmsg* procwait(int pid); | |
189 | |
190 #if defined(__cplusplus) | |
191 } | |
192 #endif | |
193 #endif /* _THREADH_ */ |