pthread.h revision 13547
113547Sjulian/*
213547Sjulian * Copyright (c) 1993, 1994 by Chris Provenzano, proven@mit.edu
313547Sjulian * Copyright (c) 1995 by John Birrell <jb@cimlogic.com.au>
413547Sjulian * All rights reserved.
513547Sjulian *
613547Sjulian * Redistribution and use in source and binary forms, with or without
713547Sjulian * modification, are permitted provided that the following conditions
813547Sjulian * are met:
913547Sjulian * 1. Redistributions of source code must retain the above copyright
1013547Sjulian *    notice, this list of conditions and the following disclaimer.
1113547Sjulian * 2. Redistributions in binary form must reproduce the above copyright
1213547Sjulian *    notice, this list of conditions and the following disclaimer in the
1313547Sjulian *    documentation and/or other materials provided with the distribution.
1413547Sjulian * 3. All advertising materials mentioning features or use of this software
1513547Sjulian *    must display the following acknowledgement:
1613547Sjulian *  This product includes software developed by Chris Provenzano.
1713547Sjulian * 4. The name of Chris Provenzano may not be used to endorse or promote
1813547Sjulian *	  products derived from this software without specific prior written
1913547Sjulian *	  permission.
2013547Sjulian *
2113547Sjulian * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND
2213547Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2313547Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2413547Sjulian * ARE DISCLAIMED.  IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY
2513547Sjulian * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2613547Sjulian * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2713547Sjulian * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
2813547Sjulian * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2913547Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3013547Sjulian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3113547Sjulian * SUCH DAMAGE.
3213547Sjulian *
3313547Sjulian */
3413547Sjulian#ifndef _PTHREAD_H_
3513547Sjulian#define _PTHREAD_H_
3613547Sjulian
3713547Sjulian/*
3813547Sjulian * Header files.
3913547Sjulian */
4013547Sjulian#include <sys/cdefs.h>
4113547Sjulian#include <sys/types.h>
4213547Sjulian#include <sys/time.h>
4313547Sjulian
4413547Sjulian/*
4513547Sjulian * Forward thread structure definition. This is opaque to the user.
4613547Sjulian */
4713547Sjulianstruct pthread;
4813547Sjulian
4913547Sjulian/*
5013547Sjulian * Queue definitions.
5113547Sjulian */
5213547Sjulianstruct pthread_queue {
5313547Sjulian	struct pthread	*q_next;
5413547Sjulian	struct pthread	*q_last;
5513547Sjulian	void		*q_data;
5613547Sjulian};
5713547Sjulian
5813547Sjulian/*
5913547Sjulian * Static queue initialization values.
6013547Sjulian */
6113547Sjulian#define PTHREAD_QUEUE_INITIALIZER { NULL, NULL, NULL }
6213547Sjulian
6313547Sjulian/*
6413547Sjulian * Mutex definitions.
6513547Sjulian */
6613547Sjulianenum pthread_mutextype {
6713547Sjulian	MUTEX_TYPE_FAST		= 1,
6813547Sjulian	MUTEX_TYPE_COUNTING_FAST	= 2,	/* Recursive */
6913547Sjulian	MUTEX_TYPE_MAX
7013547Sjulian};
7113547Sjulian
7213547Sjulianunion pthread_mutex_data {
7313547Sjulian	void	*m_ptr;
7413547Sjulian	int	m_count;
7513547Sjulian};
7613547Sjulian
7713547Sjulianstruct pthread_mutex {
7813547Sjulian	enum pthread_mutextype		m_type;
7913547Sjulian	struct pthread_queue		m_queue;
8013547Sjulian	struct pthread			*m_owner;
8113547Sjulian	union pthread_mutex_data	m_data;
8213547Sjulian	long				m_flags;
8313547Sjulian};
8413547Sjulian
8513547Sjulian/*
8613547Sjulian * Flags for mutexes.
8713547Sjulian */
8813547Sjulian#define MUTEX_FLAGS_PRIVATE	0x01
8913547Sjulian#define MUTEX_FLAGS_INITED	0x02
9013547Sjulian#define MUTEX_FLAGS_BUSY	0x04
9113547Sjulian
9213547Sjulian/*
9313547Sjulian * Static mutex initialization values.
9413547Sjulian */
9513547Sjulian#define PTHREAD_MUTEX_INITIALIZER   \
9613547Sjulian	{ MUTEX_TYPE_FAST, PTHREAD_QUEUE_INITIALIZER, \
9713547Sjulian	NULL, { NULL }, MUTEX_FLAGS_INITED }
9813547Sjulian
9913547Sjulianstruct pthread_mutex_attr {
10013547Sjulian	enum pthread_mutextype	m_type;
10113547Sjulian	long			m_flags;
10213547Sjulian};
10313547Sjulian
10413547Sjulian/*
10513547Sjulian * Condition variable definitions.
10613547Sjulian */
10713547Sjulianenum pthread_cond_type {
10813547Sjulian	COND_TYPE_FAST,
10913547Sjulian	COND_TYPE_MAX
11013547Sjulian};
11113547Sjulian
11213547Sjulianstruct pthread_cond {
11313547Sjulian	enum pthread_cond_type	c_type;
11413547Sjulian	struct pthread_queue	c_queue;
11513547Sjulian	void			*c_data;
11613547Sjulian	long			c_flags;
11713547Sjulian};
11813547Sjulian
11913547Sjulianstruct pthread_cond_attr {
12013547Sjulian	enum pthread_cond_type	c_type;
12113547Sjulian	long			c_flags;
12213547Sjulian};
12313547Sjulian
12413547Sjulian/*
12513547Sjulian * Flags for condition variables.
12613547Sjulian */
12713547Sjulian#define COND_FLAGS_PRIVATE	0x01
12813547Sjulian#define COND_FLAGS_INITED	0x02
12913547Sjulian#define COND_FLAGS_BUSY		0x04
13013547Sjulian
13113547Sjulian/*
13213547Sjulian * Static cond initialization values.
13313547Sjulian */
13413547Sjulian#define PTHREAD_COND_INITIALIZER    \
13513547Sjulian	{ COND_TYPE_FAST, PTHREAD_QUEUE_INITIALIZER, NULL, COND_FLAGS_INITED }
13613547Sjulian
13713547Sjulian/*
13813547Sjulian * Cleanup definitions.
13913547Sjulian */
14013547Sjulianstruct pthread_cleanup {
14113547Sjulian	struct pthread_cleanup	*next;
14213547Sjulian	void			(*routine) ();
14313547Sjulian	void			*routine_arg;
14413547Sjulian};
14513547Sjulian
14613547Sjulian/*
14713547Sjulian * Scheduling definitions.
14813547Sjulian */
14913547Sjulianenum schedparam_policy {
15013547Sjulian	SCHED_RR,
15113547Sjulian	SCHED_IO,
15213547Sjulian	SCHED_FIFO,
15313547Sjulian	SCHED_OTHER
15413547Sjulian};
15513547Sjulian
15613547Sjulianstruct pthread_attr {
15713547Sjulian	enum schedparam_policy	schedparam_policy;
15813547Sjulian	int			prio;
15913547Sjulian	int			suspend;
16013547Sjulian	int			flags;
16113547Sjulian	void			*arg_attr;
16213547Sjulian	void			(*cleanup_attr) ();
16313547Sjulian	void			*stackaddr_attr;
16413547Sjulian	size_t			stacksize_attr;
16513547Sjulian};
16613547Sjulian
16713547Sjulianstruct sched_param {
16813547Sjulian	int	prio;
16913547Sjulian	void	*no_data;
17013547Sjulian};
17113547Sjulian
17213547Sjulian/*
17313547Sjulian * Once definitions.
17413547Sjulian */
17513547Sjulianstruct pthread_once {
17613547Sjulian	int			state;
17713547Sjulian	struct pthread_mutex	mutex;
17813547Sjulian};
17913547Sjulian
18013547Sjulian/*
18113547Sjulian * Flags for once initialization.
18213547Sjulian */
18313547Sjulian#define PTHREAD_NEEDS_INIT  0
18413547Sjulian#define PTHREAD_DONE_INIT   1
18513547Sjulian
18613547Sjulian/*
18713547Sjulian * Static once initialization values.
18813547Sjulian */
18913547Sjulian#define PTHREAD_ONCE_INIT   { PTHREAD_NEEDS_INIT, PTHREAD_MUTEX_INITIALIZER }
19013547Sjulian
19113547Sjulian/*
19213547Sjulian * Type definitions.
19313547Sjulian */
19413547Sjuliantypedef int     pthread_key_t;
19513547Sjuliantypedef struct	pthread			*pthread_t;
19613547Sjuliantypedef struct	pthread_attr		pthread_attr_t;
19713547Sjuliantypedef struct	pthread_cond		pthread_cond_t;
19813547Sjuliantypedef struct	pthread_cond_attr	pthread_condattr_t;
19913547Sjuliantypedef struct	pthread_mutex		pthread_mutex_t;
20013547Sjuliantypedef struct	pthread_mutex_attr	pthread_mutexattr_t;
20113547Sjuliantypedef struct	pthread_once		pthread_once_t;
20213547Sjuliantypedef void	*pthread_addr_t;
20313547Sjuliantypedef void	*(*pthread_startroutine_t) (void *);
20413547Sjulian
20513547Sjulian/*
20613547Sjulian * Default attribute arguments.
20713547Sjulian */
20813547Sjulian#define pthread_condattr_default    NULL
20913547Sjulian#define pthread_mutexattr_default   NULL
21013547Sjulian#ifndef PTHREAD_KERNEL
21113547Sjulian#define pthread_attr_default        NULL
21213547Sjulian#endif
21313547Sjulian
21413547Sjulian/*
21513547Sjulian * Thread function prototype definitions:
21613547Sjulian */
21713547Sjulian__BEGIN_DECLS
21813547Sjulianint  pthread_create __P((pthread_t *, const pthread_attr_t *,
21913547Sjulian     void *(*start_routine) (void *), void *));
22013547Sjulianvoid pthread_exit __P((void *));
22113547Sjulianpthread_t pthread_self __P((void));
22213547Sjulianint  pthread_equal __P((pthread_t, pthread_t));
22313547Sjulianint  pthread_getprio __P((pthread_t));
22413547Sjulianint  pthread_setprio __P((pthread_t, int));
22513547Sjulianint  pthread_join __P((pthread_t, void **));
22613547Sjulianint  pthread_detach __P((pthread_t *));
22713547Sjulianint  pthread_resume __P((pthread_t));
22813547Sjulianint  pthread_suspend __P((pthread_t));
22913547Sjulianvoid pthread_yield __P((void));
23013547Sjulianint  pthread_setschedparam __P((pthread_t pthread, int policy,
23113547Sjulian     struct sched_param * param));
23213547Sjulianint  pthread_getschedparam __P((pthread_t pthread, int *policy,
23313547Sjulian     struct sched_param * param));
23413547Sjulianint  pthread_kill __P((struct pthread *, int));
23513547Sjulianint  pthread_cleanup_push __P((void (*routine) (void *), void *routine_arg));
23613547Sjulianvoid pthread_cleanup_pop __P((int execute));
23713547Sjulianint  pthread_cond_init __P((pthread_cond_t *, const pthread_condattr_t *));
23813547Sjulianint  pthread_cond_timedwait __P((pthread_cond_t *, pthread_mutex_t *,
23913547Sjulian     const struct timespec * abstime));
24013547Sjulianint  pthread_cond_wait __P((pthread_cond_t *, pthread_mutex_t *));
24113547Sjulianint  pthread_cond_signal __P((pthread_cond_t *));
24213547Sjulianint  pthread_cond_broadcast __P((pthread_cond_t *));
24313547Sjulianint  pthread_cond_destroy __P((pthread_cond_t *));
24413547Sjulianint  pthread_mutex_init __P((pthread_mutex_t *, const pthread_mutexattr_t *));
24513547Sjulianint  pthread_mutex_lock __P((pthread_mutex_t *));
24613547Sjulianint  pthread_mutex_unlock __P((pthread_mutex_t *));
24713547Sjulianint  pthread_mutex_trylock __P((pthread_mutex_t *));
24813547Sjulianint  pthread_mutex_destroy __P((pthread_mutex_t *));
24913547Sjulianint  pthread_attr_init __P((pthread_attr_t *));
25013547Sjulianint  pthread_attr_destroy __P((pthread_attr_t *));
25113547Sjulianint  pthread_attr_setstacksize __P((pthread_attr_t *, size_t));
25213547Sjulianint  pthread_attr_getstacksize __P((pthread_attr_t *, size_t *));
25313547Sjulianint  pthread_attr_setstackaddr __P((pthread_attr_t *, void *));
25413547Sjulianint  pthread_attr_getstackaddr __P((pthread_attr_t *, void **));
25513547Sjulianint  pthread_attr_setdetachstate __P((pthread_attr_t *, int));
25613547Sjulianint  pthread_attr_getdetachstate __P((pthread_attr_t *, int *));
25713547Sjulianint  pthread_attr_setscope __P((pthread_attr_t *, int));
25813547Sjulianint  pthread_attr_getscope __P((pthread_attr_t *, int *));
25913547Sjulianint  pthread_attr_setinheritsched __P((pthread_attr_t *, int));
26013547Sjulianint  pthread_attr_getinheritsched __P((pthread_attr_t *, int *));
26113547Sjulianint  pthread_attr_setschedpolicy __P((pthread_attr_t *, int));
26213547Sjulianint  pthread_attr_getschedpolicy __P((pthread_attr_t *, int *));
26313547Sjulianint  pthread_attr_setschedparam __P((pthread_attr_t *, struct sched_param *));
26413547Sjulianint  pthread_attr_getschedparam __P((pthread_attr_t *, struct sched_param *));
26513547Sjulianint  pthread_attr_setfloatstate __P((pthread_attr_t *, int));
26613547Sjulianint  pthread_attr_getfloatstate __P((pthread_attr_t *, int *));
26713547Sjulianint  pthread_attr_setcleanup __P((pthread_attr_t *, void (*routine) (void *), void *));
26813547Sjulianint  pthread_attr_setcreatesuspend __P((pthread_attr_t *));
26913547Sjulianint  pthread_once __P((pthread_once_t *, void (*init_routine) (void)));
27013547Sjulianint  pthread_keycreate __P((pthread_key_t *, void (*routine) (void *)));
27113547Sjulianint  pthread_setspecific __P((pthread_key_t, const void *));
27213547Sjulianint  pthread_getspecific __P((pthread_key_t, void **));
27313547Sjulianint  pthread_key_delete __P((pthread_key_t));
27413547Sjulian__END_DECLS
27513547Sjulian
27613547Sjulian#endif
277