| @@ -1,374 +0,0 @@ | | | @@ -1,374 +0,0 @@ |
1 | /* $NetBSD: pthread.h,v 1.32 2008/07/18 16:17:11 pooka 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 | * | | | |
19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | | | |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | | | |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | | | |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | | | |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | | |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | | |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | | |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | | |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | | |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | | |
29 | * POSSIBILITY OF SUCH DAMAGE. | | | |
30 | */ | | | |
31 | | | | |
32 | #ifndef _LIB_PTHREAD_H | | | |
33 | #define _LIB_PTHREAD_H | | | |
34 | | | | |
35 | #include <sys/cdefs.h> | | | |
36 | | | | |
37 | #include <time.h> /* For timespec */ | | | |
38 | #include <sched.h> | | | |
39 | #include <sys/featuretest.h> | | | |
40 | | | | |
41 | #include <pthread_types.h> | | | |
42 | | | | |
43 | __BEGIN_DECLS | | | |
44 | int pthread_atfork(void (*)(void), void (*)(void), void (*)(void)); | | | |
45 | int pthread_create(pthread_t * __restrict, | | | |
46 | const pthread_attr_t * __restrict, void *(*)(void *), | | | |
47 | void * __restrict); | | | |
48 | void pthread_exit(void *) __attribute__((__noreturn__)); | | | |
49 | int pthread_join(pthread_t, void **); | | | |
50 | int pthread_equal(pthread_t, pthread_t); | | | |
51 | pthread_t pthread_self(void); | | | |
52 | int pthread_detach(pthread_t); | | | |
53 | | | | |
54 | int pthread_getrrtimer_np(void); | | | |
55 | int pthread_setrrtimer_np(int); | | | |
56 | | | | |
57 | int pthread_attr_init(pthread_attr_t *); | | | |
58 | int pthread_attr_destroy(pthread_attr_t *); | | | |
59 | int pthread_attr_get_np(pthread_t, pthread_attr_t *); | | | |
60 | int pthread_attr_getguardsize(const pthread_attr_t * __restrict, | | | |
61 | size_t * __restrict); | | | |
62 | int pthread_attr_setguardsize(pthread_attr_t *, size_t); | | | |
63 | int pthread_attr_getinheritsched(const pthread_attr_t * __restrict, | | | |
64 | int * __restrict); | | | |
65 | int pthread_attr_setinheritsched(pthread_attr_t *, int); | | | |
66 | int pthread_attr_getschedparam(const pthread_attr_t * __restrict, | | | |
67 | struct sched_param * __restrict); | | | |
68 | int pthread_attr_setschedparam(pthread_attr_t * __restrict, | | | |
69 | const struct sched_param * __restrict); | | | |
70 | int pthread_attr_getschedpolicy(const pthread_attr_t * __restrict, | | | |
71 | int * __restrict); | | | |
72 | int pthread_attr_setschedpolicy(pthread_attr_t *, int); | | | |
73 | int pthread_attr_getscope(const pthread_attr_t * __restrict, | | | |
74 | int * __restrict); | | | |
75 | int pthread_attr_setscope(pthread_attr_t *, int); | | | |
76 | int pthread_attr_getstack(const pthread_attr_t * __restrict, | | | |
77 | void ** __restrict, size_t * __restrict); | | | |
78 | int pthread_attr_setstack(pthread_attr_t *, void *, size_t); | | | |
79 | int pthread_attr_getstacksize(const pthread_attr_t * __restrict, | | | |
80 | size_t * __restrict); | | | |
81 | int pthread_attr_setstacksize(pthread_attr_t *, size_t); | | | |
82 | int pthread_attr_getstackaddr(const pthread_attr_t * __restrict, | | | |
83 | void ** __restrict); | | | |
84 | int pthread_attr_setstackaddr(pthread_attr_t *, void *); | | | |
85 | int pthread_attr_getdetachstate(const pthread_attr_t *, int *); | | | |
86 | int pthread_attr_setdetachstate(pthread_attr_t *, int); | | | |
87 | int pthread_attr_getname_np(const pthread_attr_t *, char *, | | | |
88 | size_t, void **); | | | |
89 | int pthread_attr_setname_np(pthread_attr_t *, const char *, void *); | | | |
90 | | | | |
91 | int pthread_mutex_init(pthread_mutex_t * __restrict, | | | |
92 | const pthread_mutexattr_t * __restrict); | | | |
93 | int pthread_mutex_destroy(pthread_mutex_t *); | | | |
94 | int pthread_mutex_lock(pthread_mutex_t *); | | | |
95 | int pthread_mutex_trylock(pthread_mutex_t *); | | | |
96 | int pthread_mutex_unlock(pthread_mutex_t *); | | | |
97 | int pthread_mutexattr_init(pthread_mutexattr_t *); | | | |
98 | int pthread_mutexattr_destroy(pthread_mutexattr_t *); | | | |
99 | int pthread_mutexattr_gettype(const pthread_mutexattr_t * __restrict, | | | |
100 | int * __restrict); | | | |
101 | int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int); | | | |
102 | | | | |
103 | int pthread_cond_init(pthread_cond_t * __restrict, | | | |
104 | const pthread_condattr_t * __restrict); | | | |
105 | int pthread_cond_destroy(pthread_cond_t *); | | | |
106 | int pthread_cond_wait(pthread_cond_t * __restrict, | | | |
107 | pthread_mutex_t * __restrict); | | | |
108 | int pthread_cond_timedwait(pthread_cond_t * __restrict, | | | |
109 | pthread_mutex_t * __restrict, const struct timespec * __restrict); | | | |
110 | int pthread_cond_signal(pthread_cond_t *); | | | |
111 | int pthread_cond_broadcast(pthread_cond_t *); | | | |
112 | int pthread_condattr_init(pthread_condattr_t *); | | | |
113 | int pthread_condattr_destroy(pthread_condattr_t *); | | | |
114 | | | | |
115 | int pthread_once(pthread_once_t *, void (*)(void)); | | | |
116 | | | | |
117 | int pthread_key_create(pthread_key_t *, void (*)(void *)); | | | |
118 | int pthread_key_delete(pthread_key_t); | | | |
119 | int pthread_setspecific(pthread_key_t, const void *); | | | |
120 | void* pthread_getspecific(pthread_key_t); | | | |
121 | | | | |
122 | int pthread_cancel(pthread_t); | | | |
123 | int pthread_setcancelstate(int, int *); | | | |
124 | int pthread_setcanceltype(int, int *); | | | |
125 | void pthread_testcancel(void); | | | |
126 | | | | |
127 | int pthread_getname_np(pthread_t, char *, size_t); | | | |
128 | int pthread_setname_np(pthread_t, const char *, void *); | | | |
129 | | | | |
130 | int pthread_attr_setcreatesuspend_np(pthread_attr_t *); | | | |
131 | int pthread_suspend_np(pthread_t); | | | |
132 | int pthread_resume_np(pthread_t); | | | |
133 | | | | |
134 | unsigned int pthread_curcpu_np(void); | | | |
135 | | | | |
136 | struct pthread_cleanup_store { | | | |
137 | void *pad[4]; | | | |
138 | }; | | | |
139 | | | | |
140 | #define pthread_cleanup_push(routine, arg) \ | | | |
141 | { \ | | | |
142 | struct pthread_cleanup_store __store; \ | | | |
143 | pthread__cleanup_push((routine),(arg), &__store); | | | |
144 | | | | |
145 | #define pthread_cleanup_pop(execute) \ | | | |
146 | pthread__cleanup_pop((execute), &__store); \ | | | |
147 | } | | | |
148 | | | | |
149 | void pthread__cleanup_push(void (*)(void *), void *, void *); | | | |
150 | void pthread__cleanup_pop(int, void *); | | | |
151 | | | | |
152 | int pthread_spin_init(pthread_spinlock_t *, int); | | | |
153 | int pthread_spin_destroy(pthread_spinlock_t *); | | | |
154 | int pthread_spin_lock(pthread_spinlock_t *); | | | |
155 | int pthread_spin_trylock(pthread_spinlock_t *); | | | |
156 | int pthread_spin_unlock(pthread_spinlock_t *); | | | |
157 | | | | |
158 | int pthread_rwlock_init(pthread_rwlock_t * __restrict, | | | |
159 | const pthread_rwlockattr_t * __restrict); | | | |
160 | int pthread_rwlock_destroy(pthread_rwlock_t *); | | | |
161 | int pthread_rwlock_rdlock(pthread_rwlock_t *); | | | |
162 | int pthread_rwlock_tryrdlock(pthread_rwlock_t *); | | | |
163 | int pthread_rwlock_wrlock(pthread_rwlock_t *); | | | |
164 | int pthread_rwlock_trywrlock(pthread_rwlock_t *); | | | |
165 | int pthread_rwlock_timedrdlock(pthread_rwlock_t * __restrict, | | | |
166 | const struct timespec * __restrict); | | | |
167 | int pthread_rwlock_timedwrlock(pthread_rwlock_t * __restrict, | | | |
168 | const struct timespec * __restrict); | | | |
169 | int pthread_rwlock_unlock(pthread_rwlock_t *); | | | |
170 | int pthread_rwlockattr_init(pthread_rwlockattr_t *); | | | |
171 | int pthread_rwlockattr_destroy(pthread_rwlockattr_t *); | | | |
172 | | | | |
173 | int pthread_barrier_init(pthread_barrier_t * __restrict, | | | |
174 | const pthread_barrierattr_t * __restrict, unsigned int); | | | |
175 | int pthread_barrier_wait(pthread_barrier_t *); | | | |
176 | int pthread_barrier_destroy(pthread_barrier_t *); | | | |
177 | int pthread_barrierattr_init(pthread_barrierattr_t *); | | | |
178 | int pthread_barrierattr_destroy(pthread_barrierattr_t *); | | | |
179 | | | | |
180 | int pthread_getschedparam(pthread_t, int * __restrict, | | | |
181 | struct sched_param * __restrict); | | | |
182 | int pthread_setschedparam(pthread_t, int, const struct sched_param *); | | | |
183 | int pthread_setschedprio(pthread_t, int); | | | |
184 | | | | |
185 | int *pthread__errno(void); | | | |
186 | | | | |
187 | #if defined(_NETBSD_SOURCE) | | | |
188 | int pthread_getaffinity_np(pthread_t, size_t, cpuset_t *); | | | |
189 | int pthread_setaffinity_np(pthread_t, size_t, cpuset_t *); | | | |
190 | | | | |
191 | int pthread_mutex_held_np(pthread_mutex_t *); | | | |
192 | pthread_t pthread_mutex_owner_np(pthread_mutex_t *); | | | |
193 | | | | |
194 | int pthread_rwlock_held_np(pthread_rwlock_t *); | | | |
195 | int pthread_rwlock_wrheld_np(pthread_rwlock_t *); | | | |
196 | int pthread_rwlock_rdheld_np(pthread_rwlock_t *); | | | |
197 | | | | |
198 | int pthread_cond_has_waiters_np(pthread_cond_t *); | | | |
199 | #endif /* _NETBSD_SOURCE */ | | | |
200 | | | | |
201 | __END_DECLS | | | |
202 | | | | |
203 | #define PTHREAD_CREATE_JOINABLE 0 | | | |
204 | #define PTHREAD_CREATE_DETACHED 1 | | | |
205 | | | | |
206 | #define PTHREAD_INHERIT_SCHED 0 | | | |
207 | #define PTHREAD_EXPLICIT_SCHED 1 | | | |
208 | | | | |
209 | #define PTHREAD_SCOPE_PROCESS 0 | | | |
210 | #define PTHREAD_SCOPE_SYSTEM 1 | | | |
211 | | | | |
212 | #define PTHREAD_PROCESS_PRIVATE 0 | | | |
213 | #define PTHREAD_PROCESS_SHARED 1 | | | |
214 | | | | |
215 | #define PTHREAD_CANCEL_DEFERRED 0 | | | |
216 | #define PTHREAD_CANCEL_ASYNCHRONOUS 1 | | | |
217 | | | | |
218 | #define PTHREAD_CANCEL_ENABLE 0 | | | |
219 | #define PTHREAD_CANCEL_DISABLE 1 | | | |
220 | | | | |
221 | #define PTHREAD_BARRIER_SERIAL_THREAD 1234567 | | | |
222 | | | | |
223 | /* | | | |
224 | * POSIX 1003.1-2001, section 2.5.9.3: "The symbolic constant | | | |
225 | * PTHREAD_CANCELED expands to a constant expression of type (void *) | | | |
226 | * whose value matches no pointer to an object in memory nor the value | | | |
227 | * NULL." | | | |
228 | */ | | | |
229 | #define PTHREAD_CANCELED ((void *) 1) | | | |
230 | | | | |
231 | /* | | | |
232 | * Maximum length of a thread's name, including the terminating NUL. | | | |
233 | */ | | | |
234 | #define PTHREAD_MAX_NAMELEN_NP 32 | | | |
235 | | | | |
236 | /* | | | |
237 | * Mutex attributes. | | | |
238 | */ | | | |
239 | #define PTHREAD_MUTEX_NORMAL 0 | | | |
240 | #define PTHREAD_MUTEX_ERRORCHECK 1 | | | |
241 | #define PTHREAD_MUTEX_RECURSIVE 2 | | | |
242 | #define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL | | | |
243 | | | | |
244 | #define PTHREAD_COND_INITIALIZER _PTHREAD_COND_INITIALIZER | | | |
245 | #define PTHREAD_MUTEX_INITIALIZER _PTHREAD_MUTEX_INITIALIZER | | | |
246 | #define PTHREAD_ONCE_INIT _PTHREAD_ONCE_INIT | | | |
247 | #define PTHREAD_RWLOCK_INITIALIZER _PTHREAD_RWLOCK_INITIALIZER | | | |
248 | #define PTHREAD_SPINLOCK_INITIALIZER _PTHREAD_SPINLOCK_INITIALIZER | | | |
249 | | | | |
250 | /* | | | |
251 | * Use macros to rename many pthread functions to the corresponding | | | |
252 | * libc symbols which are either trivial/no-op stubs or the real | | | |
253 | * thing, depending on whether libpthread is linked in to the | | | |
254 | * program. This permits code, particularly libraries that do not | | | |
255 | * directly use threads but want to be thread-safe in the presence of | | | |
256 | * threaded callers, to use pthread mutexes and the like without | | | |
257 | * unnecessairly including libpthread in their linkage. | | | |
258 | * | | | |
259 | * Left out of this list are functions that can't sensibly be trivial | | | |
260 | * or no-op stubs in a single-threaded process (pthread_create, | | | |
261 | * pthread_kill, pthread_detach), functions that normally block and | | | |
262 | * wait for another thread to do something (pthread_join), and | | | |
263 | * functions that don't make sense without the previous functions | | | |
264 | * (pthread_attr_*). The pthread_cond_wait and pthread_cond_timedwait | | | |
265 | * functions are useful in implementing certain protection mechanisms, | | | |
266 | * though a non-buggy app shouldn't end up calling them in | | | |
267 | * single-threaded mode. | | | |
268 | * | | | |
269 | * The rename is done as: | | | |
270 | * #define pthread_foo __libc_foo | | | |
271 | * instead of | | | |
272 | * #define pthread_foo(x) __libc_foo((x)) | | | |
273 | * in order that taking the address of the function ("func = | | | |
274 | * &pthread_foo;") continue to work. | | | |
275 | * | | | |
276 | * POSIX/SUSv3 requires that its functions exist as functions (even if | | | |
277 | * macro versions exist) and specifically that "#undef pthread_foo" is | | | |
278 | * legal and should not break anything. Code that does such will not | | | |
279 | * successfully get the stub behavior implemented here and will | | | |
280 | * require libpthread to be linked in. | | | |
281 | */ | | | |
282 | | | | |
283 | #ifndef __LIBPTHREAD_SOURCE__ | | | |
284 | __BEGIN_DECLS | | | |
285 | int __libc_mutex_init(pthread_mutex_t * __restrict, const pthread_mutexattr_t * __restrict); | | | |
286 | int __libc_mutex_lock(pthread_mutex_t *); | | | |
287 | int __libc_mutex_trylock(pthread_mutex_t *); | | | |
288 | int __libc_mutex_unlock(pthread_mutex_t *); | | | |
289 | int __libc_mutex_destroy(pthread_mutex_t *); | | | |
290 | | | | |
291 | int __libc_mutexattr_init(pthread_mutexattr_t *); | | | |
292 | int __libc_mutexattr_settype(pthread_mutexattr_t *, int); | | | |
293 | int __libc_mutexattr_destroy(pthread_mutexattr_t *); | | | |
294 | __END_DECLS | | | |
295 | | | | |
296 | #define pthread_mutex_init __libc_mutex_init | | | |
297 | #define pthread_mutex_lock __libc_mutex_lock | | | |
298 | #define pthread_mutex_trylock __libc_mutex_trylock | | | |
299 | #define pthread_mutex_unlock __libc_mutex_unlock | | | |
300 | #define pthread_mutex_destroy __libc_mutex_destroy | | | |
301 | | | | |
302 | #define pthread_mutexattr_init __libc_mutexattr_init | | | |
303 | #define pthread_mutexattr_settype __libc_mutexattr_settype | | | |
304 | #define pthread_mutexattr_destroy __libc_mutexattr_destroy | | | |
305 | | | | |
306 | __BEGIN_DECLS | | | |
307 | int __libc_cond_init(pthread_cond_t * __restrict, | | | |
308 | const pthread_condattr_t * __restrict); | | | |
309 | int __libc_cond_signal(pthread_cond_t *); | | | |
310 | int __libc_cond_broadcast(pthread_cond_t *); | | | |
311 | int __libc_cond_wait(pthread_cond_t * __restrict, | | | |
312 | pthread_mutex_t * __restrict); | | | |
313 | int __libc_cond_timedwait(pthread_cond_t * __restrict, | | | |
314 | pthread_mutex_t * __restrict, const struct timespec * __restrict); | | | |
315 | int __libc_cond_destroy(pthread_cond_t *); | | | |
316 | __END_DECLS | | | |
317 | | | | |
318 | #define pthread_cond_init __libc_cond_init | | | |
319 | #define pthread_cond_signal __libc_cond_signal | | | |
320 | #define pthread_cond_broadcast __libc_cond_broadcast | | | |
321 | #define pthread_cond_wait __libc_cond_wait | | | |
322 | #define pthread_cond_timedwait __libc_cond_timedwait | | | |
323 | #define pthread_cond_destroy __libc_cond_destroy | | | |
324 | | | | |
325 | __BEGIN_DECLS | | | |
326 | int __libc_rwlock_init(pthread_rwlock_t * __restrict, | | | |
327 | const pthread_rwlockattr_t * __restrict); | | | |
328 | int __libc_rwlock_rdlock(pthread_rwlock_t *); | | | |
329 | int __libc_rwlock_wrlock(pthread_rwlock_t *); | | | |
330 | int __libc_rwlock_tryrdlock(pthread_rwlock_t *); | | | |
331 | int __libc_rwlock_trywrlock(pthread_rwlock_t *); | | | |
332 | int __libc_rwlock_unlock(pthread_rwlock_t *); | | | |
333 | int __libc_rwlock_destroy(pthread_rwlock_t *); | | | |
334 | __END_DECLS | | | |
335 | | | | |
336 | #define pthread_rwlock_init __libc_rwlock_init | | | |
337 | #define pthread_rwlock_rdlock __libc_rwlock_rdlock | | | |
338 | #define pthread_rwlock_wrlock __libc_rwlock_wrlock | | | |
339 | #define pthread_rwlock_tryrdlock __libc_rwlock_tryrdlock | | | |
340 | #define pthread_rwlock_trywrlock __libc_rwlock_trywrlock | | | |
341 | #define pthread_rwlock_unlock __libc_rwlock_unlock | | | |
342 | #define pthread_rwlock_destroy __libc_rwlock_destroy | | | |
343 | | | | |
344 | __BEGIN_DECLS | | | |
345 | int __libc_thr_keycreate(pthread_key_t *, void (*)(void *)); | | | |
346 | int __libc_thr_setspecific(pthread_key_t, const void *); | | | |
347 | void *__libc_thr_getspecific(pthread_key_t); | | | |
348 | int __libc_thr_keydelete(pthread_key_t); | | | |
349 | __END_DECLS | | | |
350 | | | | |
351 | #define pthread_key_create __libc_thr_keycreate | | | |
352 | #define pthread_setspecific __libc_thr_setspecific | | | |
353 | #define pthread_getspecific __libc_thr_getspecific | | | |
354 | #define pthread_key_delete __libc_thr_keydelete | | | |
355 | | | | |
356 | __BEGIN_DECLS | | | |
357 | int __libc_thr_once(pthread_once_t *, void (*)(void)); | | | |
358 | pthread_t __libc_thr_self(void); | | | |
359 | void __libc_thr_exit(void *) __attribute__((__noreturn__)); | | | |
360 | int __libc_thr_setcancelstate(int, int *); | | | |
361 | int __libc_thr_equal(pthread_t, pthread_t); | | | |
362 | unsigned int __libc_thr_curcpu(void); | | | |
363 | __END_DECLS | | | |
364 | | | | |
365 | #define pthread_once __libc_thr_once | | | |
366 | #define pthread_self __libc_thr_self | | | |
367 | #define pthread_exit __libc_thr_exit | | | |
368 | #define pthread_setcancelstate __libc_thr_setcancelstate | | | |
369 | #define pthread_equal __libc_thr_equal | | | |
370 | #define pthread_curcpu_np __libc_thr_curcpu | | | |
371 | | | | |
372 | #endif /* __LIBPTHREAD_SOURCE__ */ | | | |
373 | | | | |
374 | #endif /* _LIB_PTHREAD_H */ | | | |