xref: /freebsd/include/pthread.h (revision 05c7a37afb48ddd5ee1bd921a5d46fe59cc70b15)
1 /*
2  * Copyright (c) 1993, 1994 by Chris Provenzano, proven@mit.edu
3  * Copyright (c) 1995 by John Birrell <jb@cimlogic.com.au>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *  This product includes software developed by Chris Provenzano.
17  * 4. The name of Chris Provenzano may not be used to endorse or promote
18  *	  products derived from this software without specific prior written
19  *	  permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  */
34 #ifndef _PTHREAD_H_
35 #define _PTHREAD_H_
36 
37 /*
38  * Header files.
39  */
40 #include <sys/cdefs.h>
41 #include <sys/types.h>
42 #include <sys/time.h>
43 
44 /*
45  * Forward thread structure definition. This is opaque to the user.
46  */
47 struct pthread;
48 
49 /*
50  * Queue definitions.
51  */
52 struct pthread_queue {
53 	struct pthread	*q_next;
54 	struct pthread	*q_last;
55 	void		*q_data;
56 };
57 
58 /*
59  * Static queue initialization values.
60  */
61 #define PTHREAD_QUEUE_INITIALIZER { NULL, NULL, NULL }
62 
63 /*
64  * Mutex definitions.
65  */
66 enum pthread_mutextype {
67 	MUTEX_TYPE_FAST		= 1,
68 	MUTEX_TYPE_COUNTING_FAST	= 2,	/* Recursive */
69 	MUTEX_TYPE_MAX
70 };
71 
72 union pthread_mutex_data {
73 	void	*m_ptr;
74 	int	m_count;
75 };
76 
77 struct pthread_mutex {
78 	enum pthread_mutextype		m_type;
79 	struct pthread_queue		m_queue;
80 	struct pthread			*m_owner;
81 	union pthread_mutex_data	m_data;
82 	long				m_flags;
83 };
84 
85 /*
86  * Flags for mutexes.
87  */
88 #define MUTEX_FLAGS_PRIVATE	0x01
89 #define MUTEX_FLAGS_INITED	0x02
90 #define MUTEX_FLAGS_BUSY	0x04
91 
92 /*
93  * Static mutex initialization values.
94  */
95 #define PTHREAD_MUTEX_INITIALIZER   \
96 	{ MUTEX_TYPE_FAST, PTHREAD_QUEUE_INITIALIZER, \
97 	NULL, { NULL }, MUTEX_FLAGS_INITED }
98 
99 struct pthread_mutex_attr {
100 	enum pthread_mutextype	m_type;
101 	long			m_flags;
102 };
103 
104 /*
105  * Condition variable definitions.
106  */
107 enum pthread_cond_type {
108 	COND_TYPE_FAST,
109 	COND_TYPE_MAX
110 };
111 
112 struct pthread_cond {
113 	enum pthread_cond_type	c_type;
114 	struct pthread_queue	c_queue;
115 	void			*c_data;
116 	long			c_flags;
117 };
118 
119 struct pthread_cond_attr {
120 	enum pthread_cond_type	c_type;
121 	long			c_flags;
122 };
123 
124 /*
125  * Flags for condition variables.
126  */
127 #define COND_FLAGS_PRIVATE	0x01
128 #define COND_FLAGS_INITED	0x02
129 #define COND_FLAGS_BUSY		0x04
130 
131 /*
132  * Static cond initialization values.
133  */
134 #define PTHREAD_COND_INITIALIZER    \
135 	{ COND_TYPE_FAST, PTHREAD_QUEUE_INITIALIZER, NULL, COND_FLAGS_INITED }
136 
137 /*
138  * Cleanup definitions.
139  */
140 struct pthread_cleanup {
141 	struct pthread_cleanup	*next;
142 	void			(*routine) ();
143 	void			*routine_arg;
144 };
145 
146 /*
147  * Scheduling definitions.
148  */
149 enum schedparam_policy {
150 	SCHED_RR,
151 	SCHED_IO,
152 	SCHED_FIFO,
153 	SCHED_OTHER
154 };
155 
156 struct pthread_attr {
157 	enum schedparam_policy	schedparam_policy;
158 	int			prio;
159 	int			suspend;
160 	int			flags;
161 	void			*arg_attr;
162 	void			(*cleanup_attr) ();
163 	void			*stackaddr_attr;
164 	size_t			stacksize_attr;
165 };
166 
167 struct sched_param {
168 	int	prio;
169 	void	*no_data;
170 };
171 
172 /*
173  * Once definitions.
174  */
175 struct pthread_once {
176 	int			state;
177 	struct pthread_mutex	mutex;
178 };
179 
180 /*
181  * Flags for once initialization.
182  */
183 #define PTHREAD_NEEDS_INIT  0
184 #define PTHREAD_DONE_INIT   1
185 
186 /*
187  * Static once initialization values.
188  */
189 #define PTHREAD_ONCE_INIT   { PTHREAD_NEEDS_INIT, PTHREAD_MUTEX_INITIALIZER }
190 
191 /*
192  * Type definitions.
193  */
194 typedef int     pthread_key_t;
195 typedef struct	pthread			*pthread_t;
196 typedef struct	pthread_attr		pthread_attr_t;
197 typedef struct	pthread_cond		pthread_cond_t;
198 typedef struct	pthread_cond_attr	pthread_condattr_t;
199 typedef struct	pthread_mutex		pthread_mutex_t;
200 typedef struct	pthread_mutex_attr	pthread_mutexattr_t;
201 typedef struct	pthread_once		pthread_once_t;
202 typedef void	*pthread_addr_t;
203 typedef void	*(*pthread_startroutine_t) (void *);
204 
205 /*
206  * Default attribute arguments.
207  */
208 #define pthread_condattr_default    NULL
209 #define pthread_mutexattr_default   NULL
210 #ifndef PTHREAD_KERNEL
211 #define pthread_attr_default        NULL
212 #endif
213 
214 /*
215  * Thread function prototype definitions:
216  */
217 __BEGIN_DECLS
218 int  pthread_create __P((pthread_t *, const pthread_attr_t *,
219      void *(*start_routine) (void *), void *));
220 void pthread_exit __P((void *));
221 pthread_t pthread_self __P((void));
222 int  pthread_equal __P((pthread_t, pthread_t));
223 int  pthread_getprio __P((pthread_t));
224 int  pthread_setprio __P((pthread_t, int));
225 int  pthread_join __P((pthread_t, void **));
226 int  pthread_detach __P((pthread_t *));
227 int  pthread_resume __P((pthread_t));
228 int  pthread_suspend __P((pthread_t));
229 void pthread_yield __P((void));
230 int  pthread_setschedparam __P((pthread_t pthread, int policy,
231      struct sched_param * param));
232 int  pthread_getschedparam __P((pthread_t pthread, int *policy,
233      struct sched_param * param));
234 int  pthread_kill __P((struct pthread *, int));
235 int  pthread_cleanup_push __P((void (*routine) (void *), void *routine_arg));
236 void pthread_cleanup_pop __P((int execute));
237 int  pthread_cond_init __P((pthread_cond_t *, const pthread_condattr_t *));
238 int  pthread_cond_timedwait __P((pthread_cond_t *, pthread_mutex_t *,
239      const struct timespec * abstime));
240 int  pthread_cond_wait __P((pthread_cond_t *, pthread_mutex_t *));
241 int  pthread_cond_signal __P((pthread_cond_t *));
242 int  pthread_cond_broadcast __P((pthread_cond_t *));
243 int  pthread_cond_destroy __P((pthread_cond_t *));
244 int  pthread_mutex_init __P((pthread_mutex_t *, const pthread_mutexattr_t *));
245 int  pthread_mutex_lock __P((pthread_mutex_t *));
246 int  pthread_mutex_unlock __P((pthread_mutex_t *));
247 int  pthread_mutex_trylock __P((pthread_mutex_t *));
248 int  pthread_mutex_destroy __P((pthread_mutex_t *));
249 int  pthread_attr_init __P((pthread_attr_t *));
250 int  pthread_attr_destroy __P((pthread_attr_t *));
251 int  pthread_attr_setstacksize __P((pthread_attr_t *, size_t));
252 int  pthread_attr_getstacksize __P((pthread_attr_t *, size_t *));
253 int  pthread_attr_setstackaddr __P((pthread_attr_t *, void *));
254 int  pthread_attr_getstackaddr __P((pthread_attr_t *, void **));
255 int  pthread_attr_setdetachstate __P((pthread_attr_t *, int));
256 int  pthread_attr_getdetachstate __P((pthread_attr_t *, int *));
257 int  pthread_attr_setscope __P((pthread_attr_t *, int));
258 int  pthread_attr_getscope __P((pthread_attr_t *, int *));
259 int  pthread_attr_setinheritsched __P((pthread_attr_t *, int));
260 int  pthread_attr_getinheritsched __P((pthread_attr_t *, int *));
261 int  pthread_attr_setschedpolicy __P((pthread_attr_t *, int));
262 int  pthread_attr_getschedpolicy __P((pthread_attr_t *, int *));
263 int  pthread_attr_setschedparam __P((pthread_attr_t *, struct sched_param *));
264 int  pthread_attr_getschedparam __P((pthread_attr_t *, struct sched_param *));
265 int  pthread_attr_setfloatstate __P((pthread_attr_t *, int));
266 int  pthread_attr_getfloatstate __P((pthread_attr_t *, int *));
267 int  pthread_attr_setcleanup __P((pthread_attr_t *, void (*routine) (void *), void *));
268 int  pthread_attr_setcreatesuspend __P((pthread_attr_t *));
269 int  pthread_once __P((pthread_once_t *, void (*init_routine) (void)));
270 int  pthread_keycreate __P((pthread_key_t *, void (*routine) (void *)));
271 int  pthread_setspecific __P((pthread_key_t, const void *));
272 int  pthread_getspecific __P((pthread_key_t, void **));
273 int  pthread_key_delete __P((pthread_key_t));
274 __END_DECLS
275 
276 #endif
277