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