pthread.h revision 179662
1210284Sjmallett/*
2232812Sjmallett * Copyright (c) 1993, 1994 by Chris Provenzano, proven@mit.edu
3215990Sjmallett * Copyright (c) 1995-1998 by John Birrell <jb@cimlogic.com.au>
4210284Sjmallett * All rights reserved.
5210284Sjmallett *
6215990Sjmallett * Redistribution and use in source and binary forms, with or without
7215990Sjmallett * modification, are permitted provided that the following conditions
8215990Sjmallett * are met:
9210284Sjmallett * 1. Redistributions of source code must retain the above copyright
10215990Sjmallett *    notice, this list of conditions and the following disclaimer.
11215990Sjmallett * 2. Redistributions in binary form must reproduce the above copyright
12210284Sjmallett *    notice, this list of conditions and the following disclaimer in the
13215990Sjmallett *    documentation and/or other materials provided with the distribution.
14215990Sjmallett * 3. All advertising materials mentioning features or use of this software
15215990Sjmallett *    must display the following acknowledgement:
16215990Sjmallett *  This product includes software developed by Chris Provenzano.
17215990Sjmallett * 4. The name of Chris Provenzano may not be used to endorse or promote
18232812Sjmallett *	  products derived from this software without specific prior written
19215990Sjmallett *	  permission.
20215990Sjmallett *
21215990Sjmallett * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND
22215990Sjmallett * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23215990Sjmallett * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24215990Sjmallett * ARE DISCLAIMED.  IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY
25215990Sjmallett * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26215990Sjmallett * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27215990Sjmallett * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28215990Sjmallett * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29232812Sjmallett * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30215990Sjmallett * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31215990Sjmallett * SUCH DAMAGE.
32215990Sjmallett *
33215990Sjmallett * $FreeBSD: head/include/pthread.h 179662 2008-06-09 01:14:10Z davidxu $
34215990Sjmallett */
35215990Sjmallett#ifndef _PTHREAD_H_
36215990Sjmallett#define _PTHREAD_H_
37215990Sjmallett
38210284Sjmallett/*
39210284Sjmallett * Header files.
40210284Sjmallett */
41215990Sjmallett#include <sys/cdefs.h>
42210284Sjmallett#include <sys/_pthreadtypes.h>
43210284Sjmallett#include <machine/_limits.h>
44210284Sjmallett#include <machine/_types.h>
45210284Sjmallett#include <sys/_sigset.h>
46210284Sjmallett#include <sched.h>
47210284Sjmallett#include <time.h>
48210284Sjmallett
49210284Sjmallett/*
50210284Sjmallett * Run-time invariant values:
51210284Sjmallett */
52210284Sjmallett#define PTHREAD_DESTRUCTOR_ITERATIONS		4
53210284Sjmallett#define PTHREAD_KEYS_MAX			256
54215990Sjmallett#define PTHREAD_STACK_MIN			__MINSIGSTKSZ
55215990Sjmallett#define PTHREAD_THREADS_MAX			__ULONG_MAX
56210284Sjmallett#define PTHREAD_BARRIER_SERIAL_THREAD		-1
57210284Sjmallett
58210284Sjmallett/*
59210284Sjmallett * Flags for threads and thread attributes.
60210284Sjmallett */
61210284Sjmallett#define PTHREAD_DETACHED            0x1
62215990Sjmallett#define PTHREAD_SCOPE_SYSTEM        0x2
63215990Sjmallett#define PTHREAD_INHERIT_SCHED       0x4
64210284Sjmallett#define PTHREAD_NOFLOAT             0x8
65210284Sjmallett
66210284Sjmallett#define PTHREAD_CREATE_DETACHED     PTHREAD_DETACHED
67215990Sjmallett#define PTHREAD_CREATE_JOINABLE     0
68210284Sjmallett#define PTHREAD_SCOPE_PROCESS       0
69210284Sjmallett#define PTHREAD_EXPLICIT_SCHED      0
70210284Sjmallett
71210284Sjmallett/*
72210284Sjmallett * Flags for read/write lock attributes
73210284Sjmallett */
74210284Sjmallett#define PTHREAD_PROCESS_PRIVATE     0
75210284Sjmallett#define PTHREAD_PROCESS_SHARED      1
76210284Sjmallett
77210284Sjmallett/*
78210284Sjmallett * Flags for cancelling threads
79210284Sjmallett */
80210284Sjmallett#define PTHREAD_CANCEL_ENABLE		0
81210284Sjmallett#define PTHREAD_CANCEL_DISABLE		1
82210284Sjmallett#define PTHREAD_CANCEL_DEFERRED		0
83210284Sjmallett#define PTHREAD_CANCEL_ASYNCHRONOUS	2
84210284Sjmallett#define PTHREAD_CANCELED		((void *) 1)
85210284Sjmallett
86210284Sjmallett/*
87210284Sjmallett * Flags for once initialization.
88210284Sjmallett */
89210284Sjmallett#define PTHREAD_NEEDS_INIT  0
90210284Sjmallett#define PTHREAD_DONE_INIT   1
91215990Sjmallett
92210284Sjmallett/*
93210284Sjmallett * Static once initialization values.
94210284Sjmallett */
95210284Sjmallett#define PTHREAD_ONCE_INIT   { PTHREAD_NEEDS_INIT, NULL }
96210284Sjmallett
97210284Sjmallett/*
98210284Sjmallett * Static initialization values.
99210284Sjmallett */
100210284Sjmallett#define PTHREAD_MUTEX_INITIALIZER	NULL
101210284Sjmallett#define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP	NULL
102210284Sjmallett#define PTHREAD_COND_INITIALIZER	NULL
103210284Sjmallett#define PTHREAD_RWLOCK_INITIALIZER	NULL
104210284Sjmallett
105210284Sjmallett/*
106210284Sjmallett * Default attribute arguments (draft 4, deprecated).
107210284Sjmallett */
108210284Sjmallett#ifndef PTHREAD_KERNEL
109210284Sjmallett#define pthread_condattr_default    NULL
110210284Sjmallett#define pthread_mutexattr_default   NULL
111210284Sjmallett#define pthread_attr_default        NULL
112210284Sjmallett#endif
113210284Sjmallett
114210284Sjmallett#define PTHREAD_PRIO_NONE	0
115210284Sjmallett#define PTHREAD_PRIO_INHERIT	1
116210284Sjmallett#define PTHREAD_PRIO_PROTECT	2
117210284Sjmallett
118210284Sjmallett/*
119210284Sjmallett * Mutex types (Single UNIX Specification, Version 2, 1997).
120210284Sjmallett *
121210284Sjmallett * Note that a mutex attribute with one of the following types:
122210284Sjmallett *
123210284Sjmallett *	PTHREAD_MUTEX_NORMAL
124210284Sjmallett *	PTHREAD_MUTEX_RECURSIVE
125210284Sjmallett *
126210284Sjmallett * will deviate from POSIX specified semantics.
127210284Sjmallett */
128210284Sjmallettenum pthread_mutextype {
129210284Sjmallett	PTHREAD_MUTEX_ERRORCHECK	= 1,	/* Default POSIX mutex */
130210284Sjmallett	PTHREAD_MUTEX_RECURSIVE		= 2,	/* Recursive mutex */
131210284Sjmallett	PTHREAD_MUTEX_NORMAL		= 3,	/* No error checking */
132210284Sjmallett	PTHREAD_MUTEX_ADAPTIVE_NP	= 4,	/* Adaptive mutex, spins briefly before blocking on lock */
133210284Sjmallett	PTHREAD_MUTEX_TYPE_MAX
134210284Sjmallett};
135210284Sjmallett
136210284Sjmallett#define PTHREAD_MUTEX_DEFAULT		PTHREAD_MUTEX_ERRORCHECK
137210284Sjmallett
138210284Sjmallettstruct _pthread_cleanup_info {
139210284Sjmallett	__uintptr_t	pthread_cleanup_pad[8];
140210284Sjmallett};
141210284Sjmallett
142210284Sjmallett/*
143210284Sjmallett * Thread function prototype definitions:
144210284Sjmallett */
145210284Sjmallett__BEGIN_DECLS
146210284Sjmallettint		pthread_atfork(void (*)(void), void (*)(void), void (*)(void));
147210284Sjmallettint		pthread_attr_destroy(pthread_attr_t *);
148210284Sjmallettint		pthread_attr_getstack(const pthread_attr_t * __restrict,
149210284Sjmallett			void ** __restrict, size_t * __restrict);
150210284Sjmallettint		pthread_attr_getstacksize(const pthread_attr_t *, size_t *);
151215990Sjmallettint		pthread_attr_getguardsize(const pthread_attr_t *, size_t *);
152210284Sjmallettint		pthread_attr_getstackaddr(const pthread_attr_t *, void **);
153210284Sjmallettint		pthread_attr_getdetachstate(const pthread_attr_t *, int *);
154215990Sjmallettint		pthread_attr_init(pthread_attr_t *);
155210284Sjmallettint		pthread_attr_setstacksize(pthread_attr_t *, size_t);
156210284Sjmallettint		pthread_attr_setguardsize(pthread_attr_t *, size_t);
157210284Sjmallettint		pthread_attr_setstack(pthread_attr_t *, void *, size_t);
158215990Sjmallettint		pthread_attr_setstackaddr(pthread_attr_t *, void *);
159210284Sjmallettint		pthread_attr_setdetachstate(pthread_attr_t *, int);
160215990Sjmallettint		pthread_barrier_destroy(pthread_barrier_t *);
161210284Sjmallettint		pthread_barrier_init(pthread_barrier_t *,
162210284Sjmallett			const pthread_barrierattr_t *, unsigned);
163210284Sjmallettint		pthread_barrier_wait(pthread_barrier_t *);
164210284Sjmallettint		pthread_barrierattr_destroy(pthread_barrierattr_t *);
165210284Sjmallettint		pthread_barrierattr_getpshared(const pthread_barrierattr_t *,
166215990Sjmallett			int *);
167210284Sjmallettint		pthread_barrierattr_init(pthread_barrierattr_t *);
168210284Sjmallettint		pthread_barrierattr_setpshared(pthread_barrierattr_t *, int);
169215990Sjmallett
170210284Sjmallett#define		pthread_cleanup_push(cleanup_routine, cleanup_arg)		\
171210284Sjmallett		{								\
172210284Sjmallett			struct _pthread_cleanup_info __cleanup_info__;		\
173215990Sjmallett			__pthread_cleanup_push_imp(cleanup_routine, cleanup_arg,\
174210284Sjmallett				&__cleanup_info__);				\
175215990Sjmallett			{
176210284Sjmallett
177210284Sjmallett#define		pthread_cleanup_pop(execute)					\
178210284Sjmallett			}							\
179210284Sjmallett			__pthread_cleanup_pop_imp(execute);			\
180210284Sjmallett		}
181210284Sjmallett
182210284Sjmallettint		pthread_condattr_destroy(pthread_condattr_t *);
183210284Sjmallettint		pthread_condattr_getclock(const pthread_condattr_t *,
184210284Sjmallett			clockid_t *);
185210284Sjmallettint		pthread_condattr_getpshared(const pthread_condattr_t *, int *);
186210284Sjmallettint		pthread_condattr_init(pthread_condattr_t *);
187210284Sjmallettint		pthread_condattr_setclock(pthread_condattr_t *, clockid_t);
188210284Sjmallettint		pthread_condattr_setpshared(pthread_condattr_t *, int);
189210284Sjmallettint		pthread_cond_broadcast(pthread_cond_t *);
190210284Sjmallettint		pthread_cond_destroy(pthread_cond_t *);
191210284Sjmallettint		pthread_cond_init(pthread_cond_t *,
192210284Sjmallett			const pthread_condattr_t *);
193210284Sjmallettint		pthread_cond_signal(pthread_cond_t *);
194210284Sjmallettint		pthread_cond_timedwait(pthread_cond_t *,
195215990Sjmallett			pthread_mutex_t *, const struct timespec *);
196210284Sjmallettint		pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
197215990Sjmallettint		pthread_create(pthread_t *, const pthread_attr_t *,
198210284Sjmallett			void *(*) (void *), void *);
199215990Sjmallettint		pthread_detach(pthread_t);
200210284Sjmallettint		pthread_equal(pthread_t, pthread_t);
201210284Sjmallettvoid		pthread_exit(void *) __dead2;
202210284Sjmallettvoid		*pthread_getspecific(pthread_key_t);
203210284Sjmallettint		pthread_getcpuclockid(pthread_t, clockid_t *);
204210284Sjmallettint		pthread_join(pthread_t, void **);
205210284Sjmallettint		pthread_key_create(pthread_key_t *,
206210284Sjmallett			void (*) (void *));
207210284Sjmallettint		pthread_key_delete(pthread_key_t);
208210284Sjmallettint		pthread_kill(pthread_t, int);
209210284Sjmallettint		pthread_mutexattr_init(pthread_mutexattr_t *);
210210284Sjmallettint		pthread_mutexattr_destroy(pthread_mutexattr_t *);
211215990Sjmallettint		pthread_mutexattr_getpshared(const pthread_mutexattr_t *,
212210284Sjmallett			int *);
213215990Sjmallettint		pthread_mutexattr_gettype(pthread_mutexattr_t *, int *);
214210284Sjmallettint		pthread_mutexattr_settype(pthread_mutexattr_t *, int);
215210284Sjmallettint		pthread_mutexattr_setpshared(pthread_mutexattr_t *, int);
216215990Sjmallettint		pthread_mutex_destroy(pthread_mutex_t *);
217210284Sjmallettint		pthread_mutex_init(pthread_mutex_t *,
218215990Sjmallett			const pthread_mutexattr_t *);
219215990Sjmallettint		pthread_mutex_lock(pthread_mutex_t *);
220210284Sjmallettint		pthread_mutex_trylock(pthread_mutex_t *);
221210284Sjmallettint		pthread_mutex_timedlock(pthread_mutex_t *,
222215990Sjmallett			const struct timespec *);
223210284Sjmallettint		pthread_mutex_unlock(pthread_mutex_t *);
224215990Sjmallettint		pthread_once(pthread_once_t *, void (*) (void));
225210284Sjmallettint		pthread_rwlock_destroy(pthread_rwlock_t *);
226210284Sjmallettint		pthread_rwlock_init(pthread_rwlock_t *,
227210284Sjmallett			const pthread_rwlockattr_t *);
228215990Sjmallettint		pthread_rwlock_rdlock(pthread_rwlock_t *);
229210284Sjmallettint		pthread_rwlock_timedrdlock(pthread_rwlock_t *,
230210284Sjmallett			const struct timespec *);
231210284Sjmallettint		pthread_rwlock_timedwrlock(pthread_rwlock_t *,
232210284Sjmallett			const struct timespec *);
233210284Sjmallettint		pthread_rwlock_tryrdlock(pthread_rwlock_t *);
234210284Sjmallettint		pthread_rwlock_trywrlock(pthread_rwlock_t *);
235210284Sjmallettint		pthread_rwlock_unlock(pthread_rwlock_t *);
236210284Sjmallettint		pthread_rwlock_wrlock(pthread_rwlock_t *);
237210284Sjmallettint		pthread_rwlockattr_init(pthread_rwlockattr_t *);
238210284Sjmallettint		pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *,
239210284Sjmallett			int *);
240210284Sjmallettint		pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int);
241210284Sjmallettint		pthread_rwlockattr_destroy(pthread_rwlockattr_t *);
242210284Sjmallettpthread_t	pthread_self(void);
243210284Sjmallettint		pthread_setspecific(pthread_key_t, const void *);
244210284Sjmallettint		pthread_sigmask(int, const __sigset_t *, __sigset_t *);
245210284Sjmallett
246210284Sjmallettint		pthread_spin_init(pthread_spinlock_t *, int);
247210284Sjmallettint		pthread_spin_destroy(pthread_spinlock_t *);
248210284Sjmallettint		pthread_spin_lock(pthread_spinlock_t *);
249210284Sjmallettint		pthread_spin_trylock(pthread_spinlock_t *);
250210284Sjmallettint		pthread_spin_unlock(pthread_spinlock_t *);
251210284Sjmallettint		pthread_cancel(pthread_t);
252210284Sjmallettint		pthread_setcancelstate(int, int *);
253210284Sjmallettint		pthread_setcanceltype(int, int *);
254210284Sjmallettvoid		pthread_testcancel(void);
255210284Sjmallett
256210284Sjmallettint		pthread_getprio(pthread_t);
257210284Sjmallettint		pthread_setprio(pthread_t, int);
258210284Sjmallettvoid		pthread_yield(void);
259210284Sjmallett
260210284Sjmallettint		pthread_mutexattr_getprioceiling(pthread_mutexattr_t *,
261210284Sjmallett			int *);
262210284Sjmallettint		pthread_mutexattr_setprioceiling(pthread_mutexattr_t *,
263210284Sjmallett			int);
264210284Sjmallettint		pthread_mutex_getprioceiling(pthread_mutex_t *, int *);
265210284Sjmallettint		pthread_mutex_setprioceiling(pthread_mutex_t *, int, int *);
266210284Sjmallett
267210284Sjmallettint		pthread_mutexattr_getprotocol(pthread_mutexattr_t *, int *);
268210284Sjmallettint		pthread_mutexattr_setprotocol(pthread_mutexattr_t *, int);
269210284Sjmallett
270210284Sjmallettint		pthread_attr_getinheritsched(const pthread_attr_t *, int *);
271210284Sjmallettint		pthread_attr_getschedparam(const pthread_attr_t *,
272210284Sjmallett			struct sched_param *);
273210284Sjmallettint		pthread_attr_getschedpolicy(const pthread_attr_t *, int *);
274210284Sjmallettint		pthread_attr_getscope(const pthread_attr_t *, int *);
275210284Sjmallettint		pthread_attr_setinheritsched(pthread_attr_t *, int);
276210284Sjmallettint		pthread_attr_setschedparam(pthread_attr_t *,
277210284Sjmallett			const struct sched_param *);
278210284Sjmallettint		pthread_attr_setschedpolicy(pthread_attr_t *, int);
279210284Sjmallettint		pthread_attr_setscope(pthread_attr_t *, int);
280210284Sjmallettint		pthread_getschedparam(pthread_t pthread, int *,
281210284Sjmallett			struct sched_param *);
282210284Sjmallettint		pthread_setschedparam(pthread_t, int,
283210284Sjmallett			const struct sched_param *);
284210284Sjmallettint		pthread_getconcurrency(void);
285210284Sjmallettint		pthread_setconcurrency(int);
286210284Sjmallett
287210284Sjmallettvoid		__pthread_cleanup_push_imp(void (*)(void *), void *,
288210284Sjmallett			struct _pthread_cleanup_info *);
289210284Sjmallettvoid		__pthread_cleanup_pop_imp(int);
290210284Sjmallett__END_DECLS
291210284Sjmallett
292210284Sjmallett#endif
293210284Sjmallett