1/* pthread.h 2 * 3 * Written by Joel Sherrill <joel@OARcorp.com>. 4 * 5 * COPYRIGHT (c) 1989-2010. 6 * On-Line Applications Research Corporation (OAR). 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose without fee is hereby granted, provided that this entire notice 10 * is included in all copies of any software which is or includes a copy 11 * or modification of this software. 12 * 13 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED 14 * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION 15 * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS 16 * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. 17 * 18 * $Id: pthread.h,v 1.10 2013/01/22 21:20:08 joel Exp $ 19 */ 20 21#ifndef __PTHREAD_h 22#define __PTHREAD_h 23 24#ifdef __cplusplus 25extern "C" { 26#endif 27 28#include <unistd.h> 29 30#if defined(_POSIX_THREADS) 31 32#include <sys/types.h> 33#include <time.h> 34#include <sys/sched.h> 35 36/* Register Fork Handlers */ 37int _EXFUN(pthread_atfork,(void (*prepare)(void), void (*parent)(void), 38 void (*child)(void))); 39 40/* Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81 */ 41 42int _EXFUN(pthread_mutexattr_init, (pthread_mutexattr_t *__attr)); 43int _EXFUN(pthread_mutexattr_destroy, (pthread_mutexattr_t *__attr)); 44int _EXFUN(pthread_mutexattr_getpshared, 45 (_CONST pthread_mutexattr_t *__attr, int *__pshared)); 46int _EXFUN(pthread_mutexattr_setpshared, 47 (pthread_mutexattr_t *__attr, int __pshared)); 48 49#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) 50 51/* Single UNIX Specification 2 Mutex Attributes types */ 52 53int _EXFUN(pthread_mutexattr_gettype, 54 (_CONST pthread_mutexattr_t *__attr, int *__kind)); 55int _EXFUN(pthread_mutexattr_settype, 56 (pthread_mutexattr_t *__attr, int __kind)); 57 58#endif 59 60/* Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87 */ 61 62int _EXFUN(pthread_mutex_init, 63 (pthread_mutex_t *__mutex, _CONST pthread_mutexattr_t *__attr)); 64int _EXFUN(pthread_mutex_destroy, (pthread_mutex_t *__mutex)); 65 66/* This is used to statically initialize a pthread_mutex_t. Example: 67 68 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 69 */ 70 71#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) 0xFFFFFFFF) 72 73/* Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93 74 NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29 */ 75 76int _EXFUN(pthread_mutex_lock, (pthread_mutex_t *__mutex)); 77int _EXFUN(pthread_mutex_trylock, (pthread_mutex_t *__mutex)); 78int _EXFUN(pthread_mutex_unlock, (pthread_mutex_t *__mutex)); 79 80#if defined(_POSIX_TIMEOUTS) 81 82int _EXFUN(pthread_mutex_timedlock, 83 (pthread_mutex_t *__mutex, _CONST struct timespec *__timeout)); 84 85#endif /* _POSIX_TIMEOUTS */ 86 87/* Condition Variable Initialization Attributes, P1003.1c/Draft 10, p. 96 */ 88 89int _EXFUN(pthread_condattr_init, (pthread_condattr_t *__attr)); 90int _EXFUN(pthread_condattr_destroy, (pthread_condattr_t *__attr)); 91int _EXFUN(pthread_condattr_getpshared, 92 (_CONST pthread_condattr_t *__attr, int *__pshared)); 93int _EXFUN(pthread_condattr_setpshared, 94 (pthread_condattr_t *__attr, int __pshared)); 95 96/* Initializing and Destroying a Condition Variable, P1003.1c/Draft 10, p. 87 */ 97 98int _EXFUN(pthread_cond_init, 99 (pthread_cond_t *__cond, _CONST pthread_condattr_t *__attr)); 100int _EXFUN(pthread_cond_destroy, (pthread_cond_t *__mutex)); 101 102/* This is used to statically initialize a pthread_cond_t. Example: 103 104 pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 105 */ 106 107#define PTHREAD_COND_INITIALIZER ((pthread_cond_t) 0xFFFFFFFF) 108 109/* Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101 */ 110 111int _EXFUN(pthread_cond_signal, (pthread_cond_t *__cond)); 112int _EXFUN(pthread_cond_broadcast, (pthread_cond_t *__cond)); 113 114/* Waiting on a Condition, P1003.1c/Draft 10, p. 105 */ 115 116int _EXFUN(pthread_cond_wait, 117 (pthread_cond_t *__cond, pthread_mutex_t *__mutex)); 118 119int _EXFUN(pthread_cond_timedwait, 120 (pthread_cond_t *__cond, pthread_mutex_t *__mutex, 121 _CONST struct timespec *__abstime)); 122 123#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) 124 125/* Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 */ 126 127int _EXFUN(pthread_attr_setscope, 128 (pthread_attr_t *__attr, int __contentionscope)); 129int _EXFUN(pthread_attr_getscope, 130 (_CONST pthread_attr_t *__attr, int *__contentionscope)); 131int _EXFUN(pthread_attr_setinheritsched, 132 (pthread_attr_t *__attr, int __inheritsched)); 133int _EXFUN(pthread_attr_getinheritsched, 134 (_CONST pthread_attr_t *__attr, int *__inheritsched)); 135int _EXFUN(pthread_attr_setschedpolicy, 136 (pthread_attr_t *__attr, int __policy)); 137int _EXFUN(pthread_attr_getschedpolicy, 138 (_CONST pthread_attr_t *__attr, int *__policy)); 139 140#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */ 141 142int _EXFUN(pthread_attr_setschedparam, 143 (pthread_attr_t *__attr, _CONST struct sched_param *__param)); 144int _EXFUN(pthread_attr_getschedparam, 145 (_CONST pthread_attr_t *__attr, struct sched_param *__param)); 146 147#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) 148 149/* Dynamic Thread Scheduling Parameters Access, P1003.1c/Draft 10, p. 124 */ 150 151int _EXFUN(pthread_getschedparam, 152 (pthread_t __pthread, int *__policy, struct sched_param *__param)); 153int _EXFUN(pthread_setschedparam, 154 (pthread_t __pthread, int __policy, struct sched_param *__param)); 155 156#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */ 157 158#if defined(_POSIX_THREAD_PRIO_INHERIT) || defined(_POSIX_THREAD_PRIO_PROTECT) 159 160/* Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128 */ 161 162int _EXFUN(pthread_mutexattr_setprotocol, 163 (pthread_mutexattr_t *__attr, int __protocol)); 164int _EXFUN(pthread_mutexattr_getprotocol, 165 (_CONST pthread_mutexattr_t *__attr, int *__protocol)); 166int _EXFUN(pthread_mutexattr_setprioceiling, 167 (pthread_mutexattr_t *__attr, int __prioceiling)); 168int _EXFUN(pthread_mutexattr_getprioceiling, 169 (_CONST pthread_mutexattr_t *__attr, int *__prioceiling)); 170 171#endif /* _POSIX_THREAD_PRIO_INHERIT || _POSIX_THREAD_PRIO_PROTECT */ 172 173#if defined(_POSIX_THREAD_PRIO_PROTECT) 174 175/* Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131 */ 176 177int _EXFUN(pthread_mutex_setprioceiling, 178 (pthread_mutex_t *__mutex, int __prioceiling, int *__old_ceiling)); 179int _EXFUN(pthread_mutex_getprioceiling, 180 (pthread_mutex_t *__mutex, int *__prioceiling)); 181 182#endif /* _POSIX_THREAD_PRIO_PROTECT */ 183 184/* Thread Creation Attributes, P1003.1c/Draft 10, p, 140 */ 185 186int _EXFUN(pthread_attr_init, (pthread_attr_t *__attr)); 187int _EXFUN(pthread_attr_destroy, (pthread_attr_t *__attr)); 188int _EXFUN(pthread_attr_setstack, (pthread_attr_t *attr, 189 void *__stackaddr, size_t __stacksize)); 190int _EXFUN(pthread_attr_getstack, (_CONST pthread_attr_t *attr, 191 void **__stackaddr, size_t *__stacksize)); 192int _EXFUN(pthread_attr_getstacksize, 193 (_CONST pthread_attr_t *__attr, size_t *__stacksize)); 194int _EXFUN(pthread_attr_setstacksize, 195 (pthread_attr_t *__attr, size_t __stacksize)); 196int _EXFUN(pthread_attr_getstackaddr, 197 (_CONST pthread_attr_t *__attr, void **__stackaddr)); 198int _EXFUN(pthread_attr_setstackaddr, 199 (pthread_attr_t *__attr, void *__stackaddr)); 200int _EXFUN(pthread_attr_getdetachstate, 201 (_CONST pthread_attr_t *__attr, int *__detachstate)); 202int _EXFUN(pthread_attr_setdetachstate, 203 (pthread_attr_t *__attr, int __detachstate)); 204int _EXFUN(pthread_attr_getguardsize, 205 (_CONST pthread_attr_t *__attr, size_t *__guardsize)); 206int _EXFUN(pthread_attr_setguardsize, 207 (pthread_attr_t *__attr, size_t __guardsize)); 208 209/* Thread Creation, P1003.1c/Draft 10, p. 144 */ 210 211int _EXFUN(pthread_create, 212 (pthread_t *__pthread, _CONST pthread_attr_t *__attr, 213 void *(*__start_routine)( void * ), void *__arg)); 214 215/* Wait for Thread Termination, P1003.1c/Draft 10, p. 147 */ 216 217int _EXFUN(pthread_join, (pthread_t __pthread, void **__value_ptr)); 218 219/* Detaching a Thread, P1003.1c/Draft 10, p. 149 */ 220 221int _EXFUN(pthread_detach, (pthread_t __pthread)); 222 223/* Thread Termination, p1003.1c/Draft 10, p. 150 */ 224 225void _EXFUN(pthread_exit, (void *__value_ptr)); 226 227/* Get Calling Thread's ID, p1003.1c/Draft 10, p. XXX */ 228 229pthread_t _EXFUN(pthread_self, (void)); 230 231/* Compare Thread IDs, p1003.1c/Draft 10, p. 153 */ 232 233int _EXFUN(pthread_equal, (pthread_t __t1, pthread_t __t2)); 234 235/* Dynamic Package Initialization */ 236 237/* This is used to statically initialize a pthread_once_t. Example: 238 239 pthread_once_t once = PTHREAD_ONCE_INIT; 240 241 NOTE: This is named inconsistently -- it should be INITIALIZER. */ 242 243#define PTHREAD_ONCE_INIT { 1, 0 } /* is initialized and not run */ 244 245int _EXFUN(pthread_once, 246 (pthread_once_t *__once_control, void (*__init_routine)(void))); 247 248/* Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163 */ 249 250int _EXFUN(pthread_key_create, 251 (pthread_key_t *__key, void (*__destructor)( void * ))); 252 253/* Thread-Specific Data Management, P1003.1c/Draft 10, p. 165 */ 254 255int _EXFUN(pthread_setspecific, 256 (pthread_key_t __key, _CONST void *__value)); 257void * _EXFUN(pthread_getspecific, (pthread_key_t __key)); 258 259/* Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167 */ 260 261int _EXFUN(pthread_key_delete, (pthread_key_t __key)); 262 263/* Execution of a Thread, P1003.1c/Draft 10, p. 181 */ 264 265#define PTHREAD_CANCEL_ENABLE 0 266#define PTHREAD_CANCEL_DISABLE 1 267 268#define PTHREAD_CANCEL_DEFERRED 0 269#define PTHREAD_CANCEL_ASYNCHRONOUS 1 270 271#define PTHREAD_CANCELED ((void *) -1) 272 273int _EXFUN(pthread_cancel, (pthread_t __pthread)); 274 275/* Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ 276 277int _EXFUN(pthread_setcancelstate, (int __state, int *__oldstate)); 278int _EXFUN(pthread_setcanceltype, (int __type, int *__oldtype)); 279void _EXFUN(pthread_testcancel, (void)); 280 281/* Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184 */ 282 283void _EXFUN(pthread_cleanup_push, 284 (void (*__routine)( void * ), void *__arg)); 285void _EXFUN(pthread_cleanup_pop, (int __execute)); 286 287#if defined(_POSIX_THREAD_CPUTIME) 288 289/* Accessing a Thread CPU-time Clock, P1003.4b/D8, p. 58 */ 290 291int _EXFUN(pthread_getcpuclockid, 292 (pthread_t __pthread_id, clockid_t *__clock_id)); 293 294#endif /* defined(_POSIX_THREAD_CPUTIME) */ 295 296 297#endif /* defined(_POSIX_THREADS) */ 298 299#if defined(_POSIX_BARRIERS) 300 301int _EXFUN(pthread_barrierattr_init, (pthread_barrierattr_t *__attr)); 302int _EXFUN(pthread_barrierattr_destroy, (pthread_barrierattr_t *__attr)); 303int _EXFUN(pthread_barrierattr_getpshared, 304 (_CONST pthread_barrierattr_t *__attr, int *__pshared)); 305int _EXFUN(pthread_barrierattr_setpshared, 306 (pthread_barrierattr_t *__attr, int __pshared)); 307 308#define PTHREAD_BARRIER_SERIAL_THREAD -1 309 310int _EXFUN(pthread_barrier_init, 311 (pthread_barrier_t *__barrier, 312 _CONST pthread_barrierattr_t *__attr, unsigned __count)); 313int _EXFUN(pthread_barrier_destroy, (pthread_barrier_t *__barrier)); 314int _EXFUN(pthread_barrier_wait,(pthread_barrier_t *__barrier)); 315 316#endif /* defined(_POSIX_BARRIERS) */ 317 318#if defined(_POSIX_SPIN_LOCKS) 319 320int _EXFUN(pthread_spin_init, 321 (pthread_spinlock_t *__spinlock, int __pshared)); 322int _EXFUN(pthread_spin_destroy, (pthread_spinlock_t *__spinlock)); 323int _EXFUN(pthread_spin_lock, (pthread_spinlock_t *__spinlock)); 324int _EXFUN(pthread_spin_trylock, (pthread_spinlock_t *__spinlock)); 325int _EXFUN(pthread_spin_unlock, (pthread_spinlock_t *__spinlock)); 326 327#endif /* defined(_POSIX_SPIN_LOCKS) */ 328 329#if defined(_POSIX_READER_WRITER_LOCKS) 330 331/* This is used to statically initialize a pthread_rwlock_t. Example: 332 333 pthread_mutex_t mutex = PTHREAD_RWLOCK_INITIALIZER; 334 */ 335 336#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) 0xFFFFFFFF) 337 338int _EXFUN(pthread_rwlockattr_init, (pthread_rwlockattr_t *__attr)); 339int _EXFUN(pthread_rwlockattr_destroy, (pthread_rwlockattr_t *__attr)); 340int _EXFUN(pthread_rwlockattr_getpshared, 341 (_CONST pthread_rwlockattr_t *__attr, int *__pshared)); 342int _EXFUN(pthread_rwlockattr_setpshared, 343 (pthread_rwlockattr_t *__attr, int __pshared)); 344 345int _EXFUN(pthread_rwlock_init, 346 (pthread_rwlock_t *__rwlock, _CONST pthread_rwlockattr_t *__attr)); 347int _EXFUN(pthread_rwlock_destroy, (pthread_rwlock_t *__rwlock)); 348int _EXFUN(pthread_rwlock_rdlock,(pthread_rwlock_t *__rwlock)); 349int _EXFUN(pthread_rwlock_tryrdlock,(pthread_rwlock_t *__rwlock)); 350int _EXFUN(pthread_rwlock_timedrdlock, 351 (pthread_rwlock_t *__rwlock, _CONST struct timespec *__abstime)); 352int _EXFUN(pthread_rwlock_unlock,(pthread_rwlock_t *__rwlock)); 353int _EXFUN(pthread_rwlock_wrlock,(pthread_rwlock_t *__rwlock)); 354int _EXFUN(pthread_rwlock_trywrlock,(pthread_rwlock_t *__rwlock)); 355int _EXFUN(pthread_rwlock_timedwrlock, 356 (pthread_rwlock_t *__rwlock, _CONST struct timespec *__abstime)); 357 358#endif /* defined(_POSIX_READER_WRITER_LOCKS) */ 359 360 361#ifdef __cplusplus 362} 363#endif 364 365#endif 366/* end of include file */ 367