pthread.h revision 149298
1233294Sstas/*
2233294Sstas * Copyright (c) 1993, 1994 by Chris Provenzano, proven@mit.edu
3233294Sstas * Copyright (c) 1995-1998 by John Birrell <jb@cimlogic.com.au>
490926Snectar * All rights reserved.
5233294Sstas *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8120945Snectar * are met:
9233294Sstas * 1. Redistributions of source code must retain the above copyright
10233294Sstas *    notice, this list of conditions and the following disclaimer.
11120945Snectar * 2. Redistributions in binary form must reproduce the above copyright
12233294Sstas *    notice, this list of conditions and the following disclaimer in the
13233294Sstas *    documentation and/or other materials provided with the distribution.
14233294Sstas * 3. All advertising materials mentioning features or use of this software
15120945Snectar *    must display the following acknowledgement:
16233294Sstas *  This product includes software developed by Chris Provenzano.
17233294Sstas * 4. The name of Chris Provenzano may not be used to endorse or promote
18233294Sstas *	  products derived from this software without specific prior written
19120945Snectar *	  permission.
20233294Sstas *
21233294Sstas * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND
22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24233294Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY
25233294Sstas * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26233294Sstas * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27233294Sstas * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28233294Sstas * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31120945Snectar * SUCH DAMAGE.
32233294Sstas *
33233294Sstas * $FreeBSD: head/include/pthread.h 149298 2005-08-19 21:31:42Z stefanf $
34120945Snectar */
3590926Snectar#ifndef _PTHREAD_H_
3690926Snectar#define _PTHREAD_H_
3790926Snectar
3890926Snectar/*
39233294Sstas * Header files.
4090926Snectar */
4190926Snectar#include <sys/cdefs.h>
4290926Snectar#include <sys/types.h>
4390926Snectar#include <sys/_pthreadtypes.h>
4490926Snectar#include <sys/time.h>
4590926Snectar#include <sys/signal.h>
4690926Snectar#include <limits.h>
4790926Snectar#include <sched.h>
4890926Snectar
4990926Snectar/*
5090926Snectar * Run-time invariant values:
5190926Snectar */
5290926Snectar#define PTHREAD_DESTRUCTOR_ITERATIONS		4
53102644Snectar#define PTHREAD_KEYS_MAX			256
54233294Sstas#define PTHREAD_STACK_MIN			MINSIGSTKSZ
5590926Snectar#define PTHREAD_THREADS_MAX			ULONG_MAX
56120945Snectar#define PTHREAD_BARRIER_SERIAL_THREAD		-1
57120945Snectar
58120945Snectar/*
5990926Snectar * Flags for threads and thread attributes.
60102644Snectar */
61233294Sstas#define PTHREAD_DETACHED            0x1
6290926Snectar#define PTHREAD_SCOPE_SYSTEM        0x2
6390926Snectar#define PTHREAD_INHERIT_SCHED       0x4
6490926Snectar#define PTHREAD_NOFLOAT             0x8
6590926Snectar
66102644Snectar#define PTHREAD_CREATE_DETACHED     PTHREAD_DETACHED
67102644Snectar#define PTHREAD_CREATE_JOINABLE     0
6890926Snectar#define PTHREAD_SCOPE_PROCESS       0
6990926Snectar#define PTHREAD_EXPLICIT_SCHED      0
70102644Snectar
71233294Sstas/*
7290926Snectar * Flags for read/write lock attributes
7390926Snectar */
74120945Snectar#define PTHREAD_PROCESS_PRIVATE     0
75120945Snectar#define PTHREAD_PROCESS_SHARED      1
76120945Snectar
77120945Snectar/*
7890926Snectar * Flags for cancelling threads
7990926Snectar */
80102644Snectar#define PTHREAD_CANCEL_ENABLE		0
81233294Sstas#define PTHREAD_CANCEL_DISABLE		1
8290926Snectar#define PTHREAD_CANCEL_DEFERRED		0
8390926Snectar#define PTHREAD_CANCEL_ASYNCHRONOUS	2
8490926Snectar#define PTHREAD_CANCELED		((void *) 1)
85178825Sdfr
8690926Snectar/*
87102644Snectar * Flags for once initialization.
88233294Sstas */
8990926Snectar#define PTHREAD_NEEDS_INIT  0
9090926Snectar#define PTHREAD_DONE_INIT   1
9190926Snectar
9290926Snectar/*
9390926Snectar * Static once initialization values.
9490926Snectar */
9590926Snectar#define PTHREAD_ONCE_INIT   { PTHREAD_NEEDS_INIT, NULL }
9690926Snectar
9790926Snectar/*
9890926Snectar * Static initialization values.
9990926Snectar */
10090926Snectar#define PTHREAD_MUTEX_INITIALIZER	NULL
10190926Snectar#define PTHREAD_COND_INITIALIZER	NULL
10290926Snectar#define PTHREAD_RWLOCK_INITIALIZER	NULL
10390926Snectar
10490926Snectar/*
105102644Snectar * Default attribute arguments (draft 4, deprecated).
106233294Sstas */
10790926Snectar#ifndef PTHREAD_KERNEL
108102644Snectar#define pthread_condattr_default    NULL
109102644Snectar#define pthread_mutexattr_default   NULL
11090926Snectar#define pthread_attr_default        NULL
111102644Snectar#endif
112102644Snectar
11390926Snectar#define PTHREAD_PRIO_NONE	0
11490926Snectar#define PTHREAD_PRIO_INHERIT	1
11590926Snectar#define PTHREAD_PRIO_PROTECT	2
116102644Snectar
117233294Sstas/*
11890926Snectar * Mutex types (Single UNIX Specification, Version 2, 1997).
119102644Snectar *
12090926Snectar * Note that a mutex attribute with one of the following types:
12190926Snectar *
12290926Snectar *	PTHREAD_MUTEX_NORMAL
12390926Snectar *	PTHREAD_MUTEX_RECURSIVE
12490926Snectar *
12590926Snectar * will deviate from POSIX specified semantics.
12690926Snectar */
12790926Snectarenum pthread_mutextype {
12890926Snectar	PTHREAD_MUTEX_ERRORCHECK	= 1,	/* Default POSIX mutex */
129102644Snectar	PTHREAD_MUTEX_RECURSIVE		= 2,	/* Recursive mutex */
13090926Snectar	PTHREAD_MUTEX_NORMAL		= 3,	/* No error checking */
13190926Snectar	PTHREAD_MUTEX_TYPE_MAX
13290926Snectar};
13390926Snectar
13490926Snectar#define PTHREAD_MUTEX_DEFAULT		PTHREAD_MUTEX_ERRORCHECK
13590926Snectar
13690926Snectar/*
13790926Snectar * Thread function prototype definitions:
13890926Snectar */
13990926Snectar__BEGIN_DECLS
140102644Snectarint		pthread_atfork(void (*)(void), void (*)(void), void (*)(void));
14190926Snectarint		pthread_attr_destroy(pthread_attr_t *);
14290926Snectarint		pthread_attr_getstack(const pthread_attr_t * __restrict,
14390926Snectar			void ** __restrict, size_t * __restrict);
14490926Snectarint		pthread_attr_getstacksize(const pthread_attr_t *, size_t *);
14590926Snectarint		pthread_attr_getguardsize(const pthread_attr_t *, size_t *);
14690926Snectarint		pthread_attr_getstackaddr(const pthread_attr_t *, void **);
14790926Snectarint		pthread_attr_getdetachstate(const pthread_attr_t *, int *);
14890926Snectarint		pthread_attr_init(pthread_attr_t *);
14990926Snectarint		pthread_attr_setstacksize(pthread_attr_t *, size_t);
15090926Snectarint		pthread_attr_setguardsize(pthread_attr_t *, size_t);
15190926Snectarint		pthread_attr_setstack(pthread_attr_t *, void *, size_t);
15290926Snectarint		pthread_attr_setstackaddr(pthread_attr_t *, void *);
15390926Snectarint		pthread_attr_setdetachstate(pthread_attr_t *, int);
15490926Snectarint		pthread_barrier_destroy(pthread_barrier_t *);
15590926Snectarint		pthread_barrier_init(pthread_barrier_t *,
15690926Snectar			const pthread_barrierattr_t *, unsigned);
15790926Snectarint		pthread_barrier_wait(pthread_barrier_t *);
15890926Snectarint		pthread_barrierattr_destroy(pthread_barrierattr_t *);
15990926Snectarint		pthread_barrierattr_getpshared(const pthread_barrierattr_t *,
16090926Snectar			int *);
16190926Snectarint		pthread_barrierattr_init(pthread_barrierattr_t *);
162int		pthread_barrierattr_setpshared(pthread_barrierattr_t *, int);
163void		pthread_cleanup_pop(int);
164void		pthread_cleanup_push(void (*) (void *), void *);
165int		pthread_condattr_destroy(pthread_condattr_t *);
166int		pthread_condattr_init(pthread_condattr_t *);
167int             pthread_condattr_getclock(const pthread_condattr_t *,
168                        clockid_t *);
169int             pthread_condattr_setclock(pthread_condattr_t *,
170                        clockid_t);
171
172int		pthread_cond_broadcast(pthread_cond_t *);
173int		pthread_cond_destroy(pthread_cond_t *);
174int		pthread_cond_init(pthread_cond_t *,
175			const pthread_condattr_t *);
176int		pthread_cond_signal(pthread_cond_t *);
177int		pthread_cond_timedwait(pthread_cond_t *,
178			pthread_mutex_t *, const struct timespec *);
179int		pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
180int		pthread_create(pthread_t *, const pthread_attr_t *,
181			void *(*) (void *), void *);
182int		pthread_detach(pthread_t);
183int		pthread_equal(pthread_t, pthread_t);
184void		pthread_exit(void *) __dead2;
185void		*pthread_getspecific(pthread_key_t);
186int		pthread_join(pthread_t, void **);
187int		pthread_key_create(pthread_key_t *,
188			void (*) (void *));
189int		pthread_key_delete(pthread_key_t);
190int		pthread_kill(pthread_t, int);
191int		pthread_mutexattr_init(pthread_mutexattr_t *);
192int		pthread_mutexattr_destroy(pthread_mutexattr_t *);
193int		pthread_mutexattr_gettype(pthread_mutexattr_t *, int *);
194int		pthread_mutexattr_settype(pthread_mutexattr_t *, int);
195int		pthread_mutex_destroy(pthread_mutex_t *);
196int		pthread_mutex_init(pthread_mutex_t *,
197			const pthread_mutexattr_t *);
198int		pthread_mutex_lock(pthread_mutex_t *);
199int		pthread_mutex_trylock(pthread_mutex_t *);
200int		pthread_mutex_timedlock(pthread_mutex_t *,
201			const struct timespec *);
202int		pthread_mutex_unlock(pthread_mutex_t *);
203int		pthread_once(pthread_once_t *, void (*) (void));
204int		pthread_rwlock_destroy(pthread_rwlock_t *);
205int		pthread_rwlock_init(pthread_rwlock_t *,
206			const pthread_rwlockattr_t *);
207int		pthread_rwlock_rdlock(pthread_rwlock_t *);
208int		pthread_rwlock_timedrdlock(pthread_rwlock_t *,
209			const struct timespec *);
210int		pthread_rwlock_timedwrlock(pthread_rwlock_t *,
211			const struct timespec *);
212int		pthread_rwlock_tryrdlock(pthread_rwlock_t *);
213int		pthread_rwlock_trywrlock(pthread_rwlock_t *);
214int		pthread_rwlock_unlock(pthread_rwlock_t *);
215int		pthread_rwlock_wrlock(pthread_rwlock_t *);
216int		pthread_rwlockattr_init(pthread_rwlockattr_t *);
217int		pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *,
218			int *);
219int		pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int);
220int		pthread_rwlockattr_destroy(pthread_rwlockattr_t *);
221pthread_t	pthread_self(void);
222int		pthread_setspecific(pthread_key_t, const void *);
223int		pthread_sigmask(int, const sigset_t *, sigset_t *);
224
225int		pthread_spin_init(pthread_spinlock_t *, int);
226int		pthread_spin_destroy(pthread_spinlock_t *);
227int		pthread_spin_lock(pthread_spinlock_t *);
228int		pthread_spin_trylock(pthread_spinlock_t *);
229int		pthread_spin_unlock(pthread_spinlock_t *);
230int		pthread_cancel(pthread_t);
231int		pthread_setcancelstate(int, int *);
232int		pthread_setcanceltype(int, int *);
233void		pthread_testcancel(void);
234
235int		pthread_getprio(pthread_t);
236int		pthread_setprio(pthread_t, int);
237void		pthread_yield(void);
238
239int		pthread_mutexattr_getprioceiling(pthread_mutexattr_t *,
240			int *);
241int		pthread_mutexattr_setprioceiling(pthread_mutexattr_t *,
242			int);
243int		pthread_mutex_getprioceiling(pthread_mutex_t *, int *);
244int		pthread_mutex_setprioceiling(pthread_mutex_t *, int, int *);
245
246int		pthread_mutexattr_getprotocol(pthread_mutexattr_t *, int *);
247int		pthread_mutexattr_setprotocol(pthread_mutexattr_t *, int);
248
249int		pthread_attr_getinheritsched(const pthread_attr_t *, int *);
250int		pthread_attr_getschedparam(const pthread_attr_t *,
251			struct sched_param *);
252int		pthread_attr_getschedpolicy(const pthread_attr_t *, int *);
253int		pthread_attr_getscope(const pthread_attr_t *, int *);
254int		pthread_attr_setinheritsched(pthread_attr_t *, int);
255int		pthread_attr_setschedparam(pthread_attr_t *,
256			const struct sched_param *);
257int		pthread_attr_setschedpolicy(pthread_attr_t *, int);
258int		pthread_attr_setscope(pthread_attr_t *, int);
259int		pthread_getschedparam(pthread_t pthread, int *,
260			struct sched_param *);
261int		pthread_setschedparam(pthread_t, int,
262			const struct sched_param *);
263int		pthread_getconcurrency(void);
264int		pthread_setconcurrency(int);
265__END_DECLS
266
267#endif
268