Annotation of src/lib/libpthread/pthread.h, Revision 1.40
1.40 ! christos 1: /* $NetBSD: pthread.h,v 1.39 2017/12/26 17:00:50 christos Exp $ */
1.2 thorpej 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>
1.27 christos 39: #include <sys/featuretest.h>
1.2 thorpej 40:
1.13 lukem 41: #include <pthread_types.h>
1.2 thorpej 42:
43: __BEGIN_DECLS
1.40 ! christos 44: #ifndef __PTHREAD_ATFORK_DECLARED
! 45: #define __PTHREAD_ATFORK_DECLARED
1.8 nathanw 46: int pthread_atfork(void (*)(void), void (*)(void), void (*)(void));
1.40 ! christos 47: #endif
1.21 kleink 48: int pthread_create(pthread_t * __restrict,
49: const pthread_attr_t * __restrict, void *(*)(void *),
50: void * __restrict);
1.4 christos 51: void pthread_exit(void *) __attribute__((__noreturn__));
52: int pthread_join(pthread_t, void **);
53: int pthread_equal(pthread_t, pthread_t);
1.2 thorpej 54: pthread_t pthread_self(void);
1.4 christos 55: int pthread_detach(pthread_t);
1.2 thorpej 56:
57: int pthread_getrrtimer_np(void);
58: int pthread_setrrtimer_np(int);
59:
1.4 christos 60: int pthread_attr_init(pthread_attr_t *);
61: int pthread_attr_destroy(pthread_attr_t *);
1.14 nathanw 62: int pthread_attr_get_np(pthread_t, pthread_attr_t *);
1.21 kleink 63: int pthread_attr_getguardsize(const pthread_attr_t * __restrict,
64: size_t * __restrict);
1.14 nathanw 65: int pthread_attr_setguardsize(pthread_attr_t *, size_t);
1.21 kleink 66: int pthread_attr_getinheritsched(const pthread_attr_t * __restrict,
67: int * __restrict);
1.14 nathanw 68: int pthread_attr_setinheritsched(pthread_attr_t *, int);
1.21 kleink 69: int pthread_attr_getschedparam(const pthread_attr_t * __restrict,
70: struct sched_param * __restrict);
71: int pthread_attr_setschedparam(pthread_attr_t * __restrict,
72: const struct sched_param * __restrict);
73: int pthread_attr_getschedpolicy(const pthread_attr_t * __restrict,
74: int * __restrict);
1.20 nathanw 75: int pthread_attr_setschedpolicy(pthread_attr_t *, int);
1.21 kleink 76: int pthread_attr_getscope(const pthread_attr_t * __restrict,
77: int * __restrict);
1.14 nathanw 78: int pthread_attr_setscope(pthread_attr_t *, int);
1.21 kleink 79: int pthread_attr_getstack(const pthread_attr_t * __restrict,
80: void ** __restrict, size_t * __restrict);
1.14 nathanw 81: int pthread_attr_setstack(pthread_attr_t *, void *, size_t);
1.21 kleink 82: int pthread_attr_getstacksize(const pthread_attr_t * __restrict,
83: size_t * __restrict);
1.14 nathanw 84: int pthread_attr_setstacksize(pthread_attr_t *, size_t);
1.21 kleink 85: int pthread_attr_getstackaddr(const pthread_attr_t * __restrict,
86: void ** __restrict);
1.14 nathanw 87: int pthread_attr_setstackaddr(pthread_attr_t *, void *);
1.4 christos 88: int pthread_attr_getdetachstate(const pthread_attr_t *, int *);
89: int pthread_attr_setdetachstate(pthread_attr_t *, int);
1.9 thorpej 90: int pthread_attr_getname_np(const pthread_attr_t *, char *,
91: size_t, void **);
92: int pthread_attr_setname_np(pthread_attr_t *, const char *, void *);
1.4 christos 93:
1.21 kleink 94: int pthread_mutex_init(pthread_mutex_t * __restrict,
95: const pthread_mutexattr_t * __restrict);
1.4 christos 96: int pthread_mutex_destroy(pthread_mutex_t *);
97: int pthread_mutex_lock(pthread_mutex_t *);
98: int pthread_mutex_trylock(pthread_mutex_t *);
99: int pthread_mutex_unlock(pthread_mutex_t *);
1.39 christos 100: #ifndef __LIBC12_SOURCE__
1.38 kamil 101: int pthread_mutex_timedlock(pthread_mutex_t * __restrict,
1.37 christos 102: const struct timespec * __restrict);
1.39 christos 103: #endif
1.37 christos 104: int pthread_mutex_getprioceiling(const pthread_mutex_t * __restrict,
105: int * __restrict);
106: int pthread_mutex_setprioceiling(pthread_mutex_t * __restrict, int,
107: int * __restrict);
1.4 christos 108: int pthread_mutexattr_init(pthread_mutexattr_t *);
109: int pthread_mutexattr_destroy(pthread_mutexattr_t *);
1.37 christos 110: #ifdef _PTHREAD_PSHARED
111: int pthread_mutexattr_getpshared(const pthread_mutexattr_t * __restrict,
112: int * __restrict);
113: int pthread_mutexattr_setpshared(pthread_mutexattr_t *, int);
114: #endif
1.21 kleink 115: int pthread_mutexattr_gettype(const pthread_mutexattr_t * __restrict,
116: int * __restrict);
1.5 wiz 117: int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int);
1.37 christos 118: int pthread_mutexattr_getprotocol(const pthread_mutexattr_t * __restrict,
119: int * __restrict);
120: int pthread_mutexattr_setprotocol(pthread_mutexattr_t*,
121: int);
122: int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t * __restrict,
123: int * __restrict);
124: int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *,
125: int);
1.21 kleink 126: int pthread_cond_init(pthread_cond_t * __restrict,
127: const pthread_condattr_t * __restrict);
1.4 christos 128: int pthread_cond_destroy(pthread_cond_t *);
1.21 kleink 129: int pthread_cond_wait(pthread_cond_t * __restrict,
130: pthread_mutex_t * __restrict);
1.33 christos 131: #ifndef __LIBC12_SOURCE__
1.21 kleink 132: int pthread_cond_timedwait(pthread_cond_t * __restrict,
133: pthread_mutex_t * __restrict, const struct timespec * __restrict);
1.33 christos 134: #endif
1.4 christos 135: int pthread_cond_signal(pthread_cond_t *);
136: int pthread_cond_broadcast(pthread_cond_t *);
137: int pthread_condattr_init(pthread_condattr_t *);
1.35 christos 138: #if defined(_NETBSD_SOURCE)
139: int pthread_condattr_setclock(pthread_condattr_t *, clockid_t);
1.37 christos 140: int pthread_condattr_getclock(const pthread_condattr_t * __restrict,
141: clockid_t * __restrict);
1.35 christos 142: #endif
1.4 christos 143: int pthread_condattr_destroy(pthread_condattr_t *);
1.37 christos 144: #ifdef _PTHREAD_PSHARED
145: int pthread_condattr_getpshared(const pthread_condattr_t * __restrict,
146: int * __restrict);
147: int pthread_condattr_setpshared(pthread_condattr_t *, int);
148: #endif
1.4 christos 149: int pthread_once(pthread_once_t *, void (*)(void));
150:
151: int pthread_key_create(pthread_key_t *, void (*)(void *));
152: int pthread_key_delete(pthread_key_t);
153: int pthread_setspecific(pthread_key_t, const void *);
154: void* pthread_getspecific(pthread_key_t);
155:
156: int pthread_cancel(pthread_t);
157: int pthread_setcancelstate(int, int *);
158: int pthread_setcanceltype(int, int *);
1.2 thorpej 159: void pthread_testcancel(void);
160:
1.9 thorpej 161: int pthread_getname_np(pthread_t, char *, size_t);
162: int pthread_setname_np(pthread_t, const char *, void *);
1.15 christos 163:
164: int pthread_attr_setcreatesuspend_np(pthread_attr_t *);
165: int pthread_suspend_np(pthread_t);
166: int pthread_resume_np(pthread_t);
1.9 thorpej 167:
1.23 ad 168: unsigned int pthread_curcpu_np(void);
169:
1.36 christos 170: int pthread_getcpuclockid(pthread_t, clockid_t *);
171:
1.2 thorpej 172: struct pthread_cleanup_store {
173: void *pad[4];
174: };
175:
1.4 christos 176: #define pthread_cleanup_push(routine, arg) \
1.2 thorpej 177: { \
1.4 christos 178: struct pthread_cleanup_store __store; \
1.2 thorpej 179: pthread__cleanup_push((routine),(arg), &__store);
180:
181: #define pthread_cleanup_pop(execute) \
182: pthread__cleanup_pop((execute), &__store); \
183: }
184:
1.4 christos 185: void pthread__cleanup_push(void (*)(void *), void *, void *);
186: void pthread__cleanup_pop(int, void *);
1.2 thorpej 187:
1.4 christos 188: int pthread_spin_init(pthread_spinlock_t *, int);
189: int pthread_spin_destroy(pthread_spinlock_t *);
190: int pthread_spin_lock(pthread_spinlock_t *);
191: int pthread_spin_trylock(pthread_spinlock_t *);
192: int pthread_spin_unlock(pthread_spinlock_t *);
193:
1.21 kleink 194: int pthread_rwlock_init(pthread_rwlock_t * __restrict,
195: const pthread_rwlockattr_t * __restrict);
1.4 christos 196: int pthread_rwlock_destroy(pthread_rwlock_t *);
197: int pthread_rwlock_rdlock(pthread_rwlock_t *);
198: int pthread_rwlock_tryrdlock(pthread_rwlock_t *);
199: int pthread_rwlock_wrlock(pthread_rwlock_t *);
200: int pthread_rwlock_trywrlock(pthread_rwlock_t *);
1.33 christos 201: #ifndef __LIBC12_SOURCE__
1.21 kleink 202: int pthread_rwlock_timedrdlock(pthread_rwlock_t * __restrict,
203: const struct timespec * __restrict);
204: int pthread_rwlock_timedwrlock(pthread_rwlock_t * __restrict,
205: const struct timespec * __restrict);
1.33 christos 206: #endif
1.4 christos 207: int pthread_rwlock_unlock(pthread_rwlock_t *);
208: int pthread_rwlockattr_init(pthread_rwlockattr_t *);
209: int pthread_rwlockattr_destroy(pthread_rwlockattr_t *);
1.37 christos 210: #ifdef _PTHREAD_PSHARED
211: int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t * __restrict,
212: int * __restrict);
213: int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int);
214: #endif
1.21 kleink 215: int pthread_barrier_init(pthread_barrier_t * __restrict,
216: const pthread_barrierattr_t * __restrict, unsigned int);
1.4 christos 217: int pthread_barrier_wait(pthread_barrier_t *);
218: int pthread_barrier_destroy(pthread_barrier_t *);
219: int pthread_barrierattr_init(pthread_barrierattr_t *);
220: int pthread_barrierattr_destroy(pthread_barrierattr_t *);
1.37 christos 221: #ifdef _PTHREAD_PSHARED
222: int pthread_barrierattr_getpshared(const pthread_barrierattr_t * __restrict,
223: int * __restrict);
224: int pthread_barrierattr_setpshared(pthread_barrierattr_t *, int);
225: #endif
1.21 kleink 226: int pthread_getschedparam(pthread_t, int * __restrict,
227: struct sched_param * __restrict);
1.16 christos 228: int pthread_setschedparam(pthread_t, int, const struct sched_param *);
1.25 rmind 229: int pthread_setschedprio(pthread_t, int);
1.2 thorpej 230:
231: int *pthread__errno(void);
1.24 ad 232:
233: #if defined(_NETBSD_SOURCE)
1.28 rmind 234: int pthread_getaffinity_np(pthread_t, size_t, cpuset_t *);
235: int pthread_setaffinity_np(pthread_t, size_t, cpuset_t *);
1.34 christos 236: int pthread_getattr_np(pthread_t, pthread_attr_t *);
1.28 rmind 237:
1.24 ad 238: int pthread_mutex_held_np(pthread_mutex_t *);
239: pthread_t pthread_mutex_owner_np(pthread_mutex_t *);
240:
241: int pthread_rwlock_held_np(pthread_rwlock_t *);
242: int pthread_rwlock_wrheld_np(pthread_rwlock_t *);
243: int pthread_rwlock_rdheld_np(pthread_rwlock_t *);
1.32 pooka 244:
245: int pthread_cond_has_waiters_np(pthread_cond_t *);
1.24 ad 246: #endif /* _NETBSD_SOURCE */
247:
1.2 thorpej 248: __END_DECLS
249:
250: #define PTHREAD_CREATE_JOINABLE 0
251: #define PTHREAD_CREATE_DETACHED 1
252:
1.14 nathanw 253: #define PTHREAD_INHERIT_SCHED 0
254: #define PTHREAD_EXPLICIT_SCHED 1
255:
256: #define PTHREAD_SCOPE_PROCESS 0
257: #define PTHREAD_SCOPE_SYSTEM 1
258:
1.2 thorpej 259: #define PTHREAD_PROCESS_PRIVATE 0
260: #define PTHREAD_PROCESS_SHARED 1
261:
262: #define PTHREAD_CANCEL_DEFERRED 0
263: #define PTHREAD_CANCEL_ASYNCHRONOUS 1
264:
265: #define PTHREAD_CANCEL_ENABLE 0
266: #define PTHREAD_CANCEL_DISABLE 1
267:
268: #define PTHREAD_BARRIER_SERIAL_THREAD 1234567
269:
270: /*
271: * POSIX 1003.1-2001, section 2.5.9.3: "The symbolic constant
272: * PTHREAD_CANCELED expands to a constant expression of type (void *)
273: * whose value matches no pointer to an object in memory nor the value
274: * NULL."
275: */
276: #define PTHREAD_CANCELED ((void *) 1)
1.9 thorpej 277:
278: /*
279: * Maximum length of a thread's name, including the terminating NUL.
280: */
281: #define PTHREAD_MAX_NAMELEN_NP 32
1.2 thorpej 282:
283: /*
284: * Mutex attributes.
285: */
286: #define PTHREAD_MUTEX_NORMAL 0
287: #define PTHREAD_MUTEX_ERRORCHECK 1
288: #define PTHREAD_MUTEX_RECURSIVE 2
289: #define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL
1.12 nathanw 290:
1.37 christos 291: #define PTHREAD_PRIO_NONE 0
292: #define PTHREAD_PRIO_INHERIT 1
293: #define PTHREAD_PRIO_PROTECT 2
294:
1.12 nathanw 295: #define PTHREAD_COND_INITIALIZER _PTHREAD_COND_INITIALIZER
296: #define PTHREAD_MUTEX_INITIALIZER _PTHREAD_MUTEX_INITIALIZER
297: #define PTHREAD_ONCE_INIT _PTHREAD_ONCE_INIT
298: #define PTHREAD_RWLOCK_INITIALIZER _PTHREAD_RWLOCK_INITIALIZER
299: #define PTHREAD_SPINLOCK_INITIALIZER _PTHREAD_SPINLOCK_INITIALIZER
1.2 thorpej 300:
1.17 nathanw 301: /*
302: * Use macros to rename many pthread functions to the corresponding
303: * libc symbols which are either trivial/no-op stubs or the real
304: * thing, depending on whether libpthread is linked in to the
305: * program. This permits code, particularly libraries that do not
306: * directly use threads but want to be thread-safe in the presence of
307: * threaded callers, to use pthread mutexes and the like without
308: * unnecessairly including libpthread in their linkage.
309: *
310: * Left out of this list are functions that can't sensibly be trivial
311: * or no-op stubs in a single-threaded process (pthread_create,
312: * pthread_kill, pthread_detach), functions that normally block and
1.18 nathanw 313: * wait for another thread to do something (pthread_join), and
314: * functions that don't make sense without the previous functions
315: * (pthread_attr_*). The pthread_cond_wait and pthread_cond_timedwait
316: * functions are useful in implementing certain protection mechanisms,
1.19 wiz 317: * though a non-buggy app shouldn't end up calling them in
1.18 nathanw 318: * single-threaded mode.
1.17 nathanw 319: *
320: * The rename is done as:
321: * #define pthread_foo __libc_foo
322: * instead of
323: * #define pthread_foo(x) __libc_foo((x))
324: * in order that taking the address of the function ("func =
325: * &pthread_foo;") continue to work.
326: *
327: * POSIX/SUSv3 requires that its functions exist as functions (even if
328: * macro versions exist) and specifically that "#undef pthread_foo" is
329: * legal and should not break anything. Code that does such will not
330: * successfully get the stub behavior implemented here and will
331: * require libpthread to be linked in.
332: */
333:
334: #ifndef __LIBPTHREAD_SOURCE__
335: __BEGIN_DECLS
1.21 kleink 336: int __libc_mutex_init(pthread_mutex_t * __restrict, const pthread_mutexattr_t * __restrict);
1.17 nathanw 337: int __libc_mutex_lock(pthread_mutex_t *);
338: int __libc_mutex_trylock(pthread_mutex_t *);
339: int __libc_mutex_unlock(pthread_mutex_t *);
340: int __libc_mutex_destroy(pthread_mutex_t *);
341:
342: int __libc_mutexattr_init(pthread_mutexattr_t *);
343: int __libc_mutexattr_settype(pthread_mutexattr_t *, int);
344: int __libc_mutexattr_destroy(pthread_mutexattr_t *);
345: __END_DECLS
346:
347: #define pthread_mutex_init __libc_mutex_init
348: #define pthread_mutex_lock __libc_mutex_lock
349: #define pthread_mutex_trylock __libc_mutex_trylock
350: #define pthread_mutex_unlock __libc_mutex_unlock
351: #define pthread_mutex_destroy __libc_mutex_destroy
352:
353: #define pthread_mutexattr_init __libc_mutexattr_init
354: #define pthread_mutexattr_settype __libc_mutexattr_settype
355: #define pthread_mutexattr_destroy __libc_mutexattr_destroy
356:
357: __BEGIN_DECLS
1.21 kleink 358: int __libc_cond_init(pthread_cond_t * __restrict,
359: const pthread_condattr_t * __restrict);
1.17 nathanw 360: int __libc_cond_signal(pthread_cond_t *);
361: int __libc_cond_broadcast(pthread_cond_t *);
1.21 kleink 362: int __libc_cond_wait(pthread_cond_t * __restrict,
363: pthread_mutex_t * __restrict);
1.33 christos 364: #ifndef __LIBC12_SOURCE__
1.21 kleink 365: int __libc_cond_timedwait(pthread_cond_t * __restrict,
366: pthread_mutex_t * __restrict, const struct timespec * __restrict);
1.33 christos 367: #endif
1.17 nathanw 368: int __libc_cond_destroy(pthread_cond_t *);
369: __END_DECLS
370:
371: #define pthread_cond_init __libc_cond_init
372: #define pthread_cond_signal __libc_cond_signal
373: #define pthread_cond_broadcast __libc_cond_broadcast
1.18 nathanw 374: #define pthread_cond_wait __libc_cond_wait
375: #define pthread_cond_timedwait __libc_cond_timedwait
1.17 nathanw 376: #define pthread_cond_destroy __libc_cond_destroy
377:
378: __BEGIN_DECLS
1.21 kleink 379: int __libc_rwlock_init(pthread_rwlock_t * __restrict,
380: const pthread_rwlockattr_t * __restrict);
1.17 nathanw 381: int __libc_rwlock_rdlock(pthread_rwlock_t *);
382: int __libc_rwlock_wrlock(pthread_rwlock_t *);
383: int __libc_rwlock_tryrdlock(pthread_rwlock_t *);
384: int __libc_rwlock_trywrlock(pthread_rwlock_t *);
385: int __libc_rwlock_unlock(pthread_rwlock_t *);
386: int __libc_rwlock_destroy(pthread_rwlock_t *);
387: __END_DECLS
388:
389: #define pthread_rwlock_init __libc_rwlock_init
390: #define pthread_rwlock_rdlock __libc_rwlock_rdlock
391: #define pthread_rwlock_wrlock __libc_rwlock_wrlock
392: #define pthread_rwlock_tryrdlock __libc_rwlock_tryrdlock
393: #define pthread_rwlock_trywrlock __libc_rwlock_trywrlock
394: #define pthread_rwlock_unlock __libc_rwlock_unlock
395: #define pthread_rwlock_destroy __libc_rwlock_destroy
396:
397: __BEGIN_DECLS
398: int __libc_thr_keycreate(pthread_key_t *, void (*)(void *));
399: int __libc_thr_setspecific(pthread_key_t, const void *);
400: void *__libc_thr_getspecific(pthread_key_t);
401: int __libc_thr_keydelete(pthread_key_t);
402: __END_DECLS
403:
404: #define pthread_key_create __libc_thr_keycreate
405: #define pthread_setspecific __libc_thr_setspecific
406: #define pthread_getspecific __libc_thr_getspecific
407: #define pthread_key_delete __libc_thr_keydelete
408:
409: __BEGIN_DECLS
410: int __libc_thr_once(pthread_once_t *, void (*)(void));
411: pthread_t __libc_thr_self(void);
412: void __libc_thr_exit(void *) __attribute__((__noreturn__));
413: int __libc_thr_setcancelstate(int, int *);
1.22 drochner 414: int __libc_thr_equal(pthread_t, pthread_t);
1.23 ad 415: unsigned int __libc_thr_curcpu(void);
1.17 nathanw 416: __END_DECLS
417:
418: #define pthread_once __libc_thr_once
419: #define pthread_self __libc_thr_self
420: #define pthread_exit __libc_thr_exit
421: #define pthread_setcancelstate __libc_thr_setcancelstate
1.22 drochner 422: #define pthread_equal __libc_thr_equal
1.23 ad 423: #define pthread_curcpu_np __libc_thr_curcpu
1.17 nathanw 424:
425: #endif /* __LIBPTHREAD_SOURCE__ */
426:
1.2 thorpej 427: #endif /* _LIB_PTHREAD_H */
CVSweb <webmaster@jp.NetBSD.org>