xref: /netbsd-src/lib/libpthread/pthread.h (revision c62a74e6d5cfb2fb5034e98b983da7e2fc87709d)
1 /*	$NetBSD: pthread.h,v 1.2 2003/01/18 10:34:15 thorpej Exp $	*/
2 
3 /*-
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Nathan J. Williams.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *        This product includes software developed by the NetBSD
21  *        Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 #ifndef _LIB_PTHREAD_H
40 #define _LIB_PTHREAD_H
41 
42 #include <sys/cdefs.h>
43 
44 #include <time.h>	/* For timespec */
45 #include <sched.h>
46 
47 #include "pthread_types.h"
48 
49 __BEGIN_DECLS
50 int	pthread_create(pthread_t *thread, const pthread_attr_t *attr,
51 	    void *(*startfunc)(void *), void *arg);
52 void	pthread_exit(void *retval) __attribute__((__noreturn__));
53 int	pthread_join(pthread_t thread, void **valptr);
54 int	pthread_equal(pthread_t t1, pthread_t t2);
55 pthread_t	pthread_self(void);
56 int	pthread_detach(pthread_t thread);
57 
58 int	pthread_kill(pthread_t thread, int sig);
59 
60 int	pthread_getrrtimer_np(void);
61 int	pthread_setrrtimer_np(int);
62 
63 int	pthread_attr_destroy(pthread_attr_t *attr);
64 int	pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
65 int	pthread_attr_init(pthread_attr_t *attr);
66 int	pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
67 int	pthread_attr_setschedparam(pthread_attr_t *attr,
68 	    const struct sched_param *param);
69 int	pthread_attr_getschedparam(pthread_attr_t *attr,
70 	    struct sched_param *param);
71 
72 int	pthread_mutex_init(pthread_mutex_t *mutex,
73 	    const pthread_mutexattr_t *attr);
74 int	pthread_mutex_destroy(pthread_mutex_t *mutex);
75 int	pthread_mutex_lock(pthread_mutex_t *mutex);
76 int	pthread_mutex_trylock(pthread_mutex_t *mutex);
77 int	pthread_mutex_unlock(pthread_mutex_t *mutex);
78 int	pthread_mutexattr_init(pthread_mutexattr_t *attr);
79 int	pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
80 int	pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);
81 int	pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
82 
83 int	pthread_cond_init(pthread_cond_t *cond,
84 	    const pthread_condattr_t *attr);
85 int	pthread_cond_destroy(pthread_cond_t *cond);
86 int	pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
87 int	pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
88 	    const struct timespec *abstime);
89 int	pthread_cond_signal(pthread_cond_t *cond);
90 int	pthread_cond_broadcast(pthread_cond_t *cond);
91 int	pthread_condattr_init(pthread_condattr_t *attr);
92 int	pthread_condattr_destroy(pthread_condattr_t *attr);
93 
94 int	pthread_once(pthread_once_t *once_control, void (*routine)(void));
95 
96 int	pthread_key_create(pthread_key_t *key, void (*destructor)(void *));
97 int	pthread_key_delete(pthread_key_t key);
98 int	pthread_setspecific(pthread_key_t key, const void *value);
99 void*	pthread_getspecific(pthread_key_t key);
100 
101 int	pthread_cancel(pthread_t thread);
102 int	pthread_setcancelstate(int state, int *oldstate);
103 int	pthread_setcanceltype(int type, int *oldtype);
104 void	pthread_testcancel(void);
105 
106 struct pthread_cleanup_store {
107 	void	*pad[4];
108 };
109 
110 #define pthread_cleanup_push(routine,arg)			\
111         {							\
112 		struct pthread_cleanup_store __store;	\
113 		pthread__cleanup_push((routine),(arg), &__store);
114 
115 #define pthread_cleanup_pop(execute)				\
116 		pthread__cleanup_pop((execute), &__store);	\
117 	}
118 
119 void	pthread__cleanup_push(void (*routine)(void *), void *arg, void *store);
120 void	pthread__cleanup_pop(int execute, void *store);
121 
122 int	pthread_spin_init(pthread_spinlock_t *lock, int pshared);
123 int	pthread_spin_destroy(pthread_spinlock_t *lock);
124 int	pthread_spin_lock(pthread_spinlock_t *lock);
125 int	pthread_spin_trylock(pthread_spinlock_t *lock);
126 int	pthread_spin_unlock(pthread_spinlock_t *lock);
127 
128 int	pthread_rwlock_init(pthread_rwlock_t *rwlock,
129 	    const pthread_rwlockattr_t *attr);
130 int	pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
131 int	pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
132 int	pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
133 int	pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
134 int	pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
135 int	pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock,
136 	    const struct timespec *abs_timeout);
137 int	pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock,
138 	    const struct timespec *abs_timeout);
139 int	pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
140 int	pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
141 int	pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
142 
143 int	pthread_barrier_init(pthread_barrier_t *barrier,
144 	    const pthread_barrierattr_t *attr, unsigned int count);
145 int	pthread_barrier_wait(pthread_barrier_t *barrier);
146 int	pthread_barrier_destroy(pthread_barrier_t *barrier);
147 int	pthread_barrierattr_init(pthread_barrierattr_t *attr);
148 int	pthread_barrierattr_destroy(pthread_barrierattr_t *attr);
149 
150 int 	*pthread__errno(void);
151 __END_DECLS
152 
153 #define	PTHREAD_CREATE_JOINABLE	0
154 #define	PTHREAD_CREATE_DETACHED	1
155 
156 #define PTHREAD_PROCESS_PRIVATE	0
157 #define PTHREAD_PROCESS_SHARED	1
158 
159 #define PTHREAD_CANCEL_DEFERRED		0
160 #define PTHREAD_CANCEL_ASYNCHRONOUS	1
161 
162 #define PTHREAD_CANCEL_ENABLE		0
163 #define PTHREAD_CANCEL_DISABLE		1
164 
165 #define PTHREAD_BARRIER_SERIAL_THREAD	1234567
166 
167 /*
168  * POSIX 1003.1-2001, section 2.5.9.3: "The symbolic constant
169  * PTHREAD_CANCELED expands to a constant expression of type (void *)
170  * whose value matches no pointer to an object in memory nor the value
171  * NULL."
172  */
173 #define PTHREAD_CANCELED	((void *) 1)
174 
175 #define	_POSIX_THREADS
176 
177 #define PTHREAD_DESTRUCTOR_ITERATIONS	4	/* Min. required */
178 #define PTHREAD_KEYS_MAX	256
179 #define PTHREAD_STACK_MIN	4096 /* XXX Pulled out of my butt */
180 #define PTHREAD_THREADS_MAX	64		/* Min. required */
181 
182 /*
183  * Mutex attributes.
184  */
185 #define	PTHREAD_MUTEX_NORMAL		0
186 #define	PTHREAD_MUTEX_ERRORCHECK	1
187 #define	PTHREAD_MUTEX_RECURSIVE		2
188 #define	PTHREAD_MUTEX_DEFAULT		PTHREAD_MUTEX_NORMAL
189 
190 #endif /* _LIB_PTHREAD_H */
191