pthread.h revision 13547
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 */
47struct pthread;
48
49/*
50 * Queue definitions.
51 */
52struct 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 */
66enum pthread_mutextype {
67	MUTEX_TYPE_FAST		= 1,
68	MUTEX_TYPE_COUNTING_FAST	= 2,	/* Recursive */
69	MUTEX_TYPE_MAX
70};
71
72union pthread_mutex_data {
73	void	*m_ptr;
74	int	m_count;
75};
76
77struct 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
99struct pthread_mutex_attr {
100	enum pthread_mutextype	m_type;
101	long			m_flags;
102};
103
104/*
105 * Condition variable definitions.
106 */
107enum pthread_cond_type {
108	COND_TYPE_FAST,
109	COND_TYPE_MAX
110};
111
112struct 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
119struct 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 */
140struct pthread_cleanup {
141	struct pthread_cleanup	*next;
142	void			(*routine) ();
143	void			*routine_arg;
144};
145
146/*
147 * Scheduling definitions.
148 */
149enum schedparam_policy {
150	SCHED_RR,
151	SCHED_IO,
152	SCHED_FIFO,
153	SCHED_OTHER
154};
155
156struct 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
167struct sched_param {
168	int	prio;
169	void	*no_data;
170};
171
172/*
173 * Once definitions.
174 */
175struct 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 */
194typedef int     pthread_key_t;
195typedef struct	pthread			*pthread_t;
196typedef struct	pthread_attr		pthread_attr_t;
197typedef struct	pthread_cond		pthread_cond_t;
198typedef struct	pthread_cond_attr	pthread_condattr_t;
199typedef struct	pthread_mutex		pthread_mutex_t;
200typedef struct	pthread_mutex_attr	pthread_mutexattr_t;
201typedef struct	pthread_once		pthread_once_t;
202typedef void	*pthread_addr_t;
203typedef 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
218int  pthread_create __P((pthread_t *, const pthread_attr_t *,
219     void *(*start_routine) (void *), void *));
220void pthread_exit __P((void *));
221pthread_t pthread_self __P((void));
222int  pthread_equal __P((pthread_t, pthread_t));
223int  pthread_getprio __P((pthread_t));
224int  pthread_setprio __P((pthread_t, int));
225int  pthread_join __P((pthread_t, void **));
226int  pthread_detach __P((pthread_t *));
227int  pthread_resume __P((pthread_t));
228int  pthread_suspend __P((pthread_t));
229void pthread_yield __P((void));
230int  pthread_setschedparam __P((pthread_t pthread, int policy,
231     struct sched_param * param));
232int  pthread_getschedparam __P((pthread_t pthread, int *policy,
233     struct sched_param * param));
234int  pthread_kill __P((struct pthread *, int));
235int  pthread_cleanup_push __P((void (*routine) (void *), void *routine_arg));
236void pthread_cleanup_pop __P((int execute));
237int  pthread_cond_init __P((pthread_cond_t *, const pthread_condattr_t *));
238int  pthread_cond_timedwait __P((pthread_cond_t *, pthread_mutex_t *,
239     const struct timespec * abstime));
240int  pthread_cond_wait __P((pthread_cond_t *, pthread_mutex_t *));
241int  pthread_cond_signal __P((pthread_cond_t *));
242int  pthread_cond_broadcast __P((pthread_cond_t *));
243int  pthread_cond_destroy __P((pthread_cond_t *));
244int  pthread_mutex_init __P((pthread_mutex_t *, const pthread_mutexattr_t *));
245int  pthread_mutex_lock __P((pthread_mutex_t *));
246int  pthread_mutex_unlock __P((pthread_mutex_t *));
247int  pthread_mutex_trylock __P((pthread_mutex_t *));
248int  pthread_mutex_destroy __P((pthread_mutex_t *));
249int  pthread_attr_init __P((pthread_attr_t *));
250int  pthread_attr_destroy __P((pthread_attr_t *));
251int  pthread_attr_setstacksize __P((pthread_attr_t *, size_t));
252int  pthread_attr_getstacksize __P((pthread_attr_t *, size_t *));
253int  pthread_attr_setstackaddr __P((pthread_attr_t *, void *));
254int  pthread_attr_getstackaddr __P((pthread_attr_t *, void **));
255int  pthread_attr_setdetachstate __P((pthread_attr_t *, int));
256int  pthread_attr_getdetachstate __P((pthread_attr_t *, int *));
257int  pthread_attr_setscope __P((pthread_attr_t *, int));
258int  pthread_attr_getscope __P((pthread_attr_t *, int *));
259int  pthread_attr_setinheritsched __P((pthread_attr_t *, int));
260int  pthread_attr_getinheritsched __P((pthread_attr_t *, int *));
261int  pthread_attr_setschedpolicy __P((pthread_attr_t *, int));
262int  pthread_attr_getschedpolicy __P((pthread_attr_t *, int *));
263int  pthread_attr_setschedparam __P((pthread_attr_t *, struct sched_param *));
264int  pthread_attr_getschedparam __P((pthread_attr_t *, struct sched_param *));
265int  pthread_attr_setfloatstate __P((pthread_attr_t *, int));
266int  pthread_attr_getfloatstate __P((pthread_attr_t *, int *));
267int  pthread_attr_setcleanup __P((pthread_attr_t *, void (*routine) (void *), void *));
268int  pthread_attr_setcreatesuspend __P((pthread_attr_t *));
269int  pthread_once __P((pthread_once_t *, void (*init_routine) (void)));
270int  pthread_keycreate __P((pthread_key_t *, void (*routine) (void *)));
271int  pthread_setspecific __P((pthread_key_t, const void *));
272int  pthread_getspecific __P((pthread_key_t, void **));
273int  pthread_key_delete __P((pthread_key_t));
274__END_DECLS
275
276#endif
277