145b820ddSAxel Dörfler /* 2a635399bSAxel Dörfler * Copyright 2001-2008, Haiku Inc. All Rights Reserved. 3a635399bSAxel Dörfler * Distributed under the terms of the Haiku License. 445b820ddSAxel Dörfler */ 5f924ff50SAxel Dörfler #ifndef _PTHREAD_H_ 6f924ff50SAxel Dörfler #define _PTHREAD_H_ 7f924ff50SAxel Dörfler 8945fb7e3SAxel Dörfler 9*370602bfSIngo Weinhold #include <stdint.h> 10f924ff50SAxel Dörfler #include <time.h> 11f924ff50SAxel Dörfler 12945fb7e3SAxel Dörfler 135d2044f6SIngo Weinhold typedef int pthread_t; 14b7f854b8SJérôme Duval typedef struct _pthread_attr *pthread_attr_t; 15b7f854b8SJérôme Duval typedef struct _pthread_mutex *pthread_mutex_t; 16b7f854b8SJérôme Duval typedef struct _pthread_mutexattr *pthread_mutexattr_t; 17b7f854b8SJérôme Duval typedef struct _pthread_cond *pthread_cond_t; 18550a30a0SRyan Leavengood typedef struct _pthread_condattr *pthread_condattr_t; 19a00ed9faSJérôme Duval typedef int pthread_key_t; 20b7f854b8SJérôme Duval typedef struct _pthread_once pthread_once_t; 21*370602bfSIngo Weinhold typedef struct _pthread_rwlock pthread_rwlock_t; 22*370602bfSIngo Weinhold typedef struct _pthread_rwlockattr pthread_rwlockattr_t; 23b7f854b8SJérôme Duval typedef struct _pthread_barrier *pthread_barrier_t; 24b7f854b8SJérôme Duval typedef struct _pthread_barrierattr *pthread_barrierattr_t; 25b7f854b8SJérôme Duval typedef struct _pthread_spinlock *pthread_spinlock_t; 26a00ed9faSJérôme Duval 274ff6af6dSJérôme Duval struct _pthread_once { 28a00ed9faSJérôme Duval int state; 29a00ed9faSJérôme Duval pthread_mutex_t mutex; 30a00ed9faSJérôme Duval }; 31a00ed9faSJérôme Duval 32*370602bfSIngo Weinhold struct _pthread_rwlock { 33*370602bfSIngo Weinhold uint32_t flags; 34*370602bfSIngo Weinhold int32_t owner; 35*370602bfSIngo Weinhold union { 36*370602bfSIngo Weinhold struct { 37*370602bfSIngo Weinhold int32_t sem; 38*370602bfSIngo Weinhold } shared; 39*370602bfSIngo Weinhold struct { 40*370602bfSIngo Weinhold int32_t lock_sem; 41*370602bfSIngo Weinhold int32_t lock_count; 42*370602bfSIngo Weinhold int32_t reader_count; 43*370602bfSIngo Weinhold int32_t writer_count; 44*370602bfSIngo Weinhold void* waiters[2]; 45*370602bfSIngo Weinhold } local; 46*370602bfSIngo Weinhold }; 47*370602bfSIngo Weinhold }; 48*370602bfSIngo Weinhold 49*370602bfSIngo Weinhold struct _pthread_rwlockattr { 50*370602bfSIngo Weinhold uint32_t flags; 51*370602bfSIngo Weinhold }; 52f924ff50SAxel Dörfler 53f924ff50SAxel Dörfler enum pthread_mutex_type { 54f924ff50SAxel Dörfler PTHREAD_MUTEX_DEFAULT, 55f924ff50SAxel Dörfler PTHREAD_MUTEX_NORMAL, 56f924ff50SAxel Dörfler PTHREAD_MUTEX_ERRORCHECK, 57f924ff50SAxel Dörfler PTHREAD_MUTEX_RECURSIVE, 58f924ff50SAxel Dörfler }; 59f924ff50SAxel Dörfler 60f924ff50SAxel Dörfler enum pthread_process_shared { 61f924ff50SAxel Dörfler PTHREAD_PROCESS_PRIVATE, 62f924ff50SAxel Dörfler PTHREAD_PROCESS_SHARED, 63f924ff50SAxel Dörfler }; 64f924ff50SAxel Dörfler 65a00ed9faSJérôme Duval /* 66a00ed9faSJérôme Duval * Flags for threads and thread attributes. 67a00ed9faSJérôme Duval */ 68a00ed9faSJérôme Duval #define PTHREAD_DETACHED 0x1 69a00ed9faSJérôme Duval #define PTHREAD_SCOPE_SYSTEM 0x2 70a00ed9faSJérôme Duval #define PTHREAD_INHERIT_SCHED 0x4 71a00ed9faSJérôme Duval #define PTHREAD_NOFLOAT 0x8 72f924ff50SAxel Dörfler 73a00ed9faSJérôme Duval #define PTHREAD_CREATE_DETACHED PTHREAD_DETACHED 74a00ed9faSJérôme Duval #define PTHREAD_CREATE_JOINABLE 0 75a00ed9faSJérôme Duval #define PTHREAD_SCOPE_PROCESS 0 76a00ed9faSJérôme Duval #define PTHREAD_EXPLICIT_SCHED 0 77f924ff50SAxel Dörfler 78a00ed9faSJérôme Duval /* 79a00ed9faSJérôme Duval * Flags for cancelling threads 80a00ed9faSJérôme Duval */ 81a00ed9faSJérôme Duval #define PTHREAD_CANCEL_ENABLE 0 82a00ed9faSJérôme Duval #define PTHREAD_CANCEL_DISABLE 1 83a00ed9faSJérôme Duval #define PTHREAD_CANCEL_DEFERRED 0 84a00ed9faSJérôme Duval #define PTHREAD_CANCEL_ASYNCHRONOUS 2 85a00ed9faSJérôme Duval #define PTHREAD_CANCELED ((void *) 1) 86a00ed9faSJérôme Duval 87a00ed9faSJérôme Duval #define PTHREAD_NEEDS_INIT 0 88a00ed9faSJérôme Duval #define PTHREAD_DONE_INIT 1 89a00ed9faSJérôme Duval #define PTHREAD_ONCE_INIT { PTHREAD_NEEDS_INIT, NULL } 90a00ed9faSJérôme Duval 91a00ed9faSJérôme Duval #define PTHREAD_BARRIER_SERIAL_THREAD -1 92a00ed9faSJérôme Duval #define PTHREAD_PRIO_NONE 0 93a00ed9faSJérôme Duval #define PTHREAD_PRIO_INHERIT 1 94a00ed9faSJérôme Duval #define PTHREAD_PRIO_PROTECT 2 95f924ff50SAxel Dörfler 96b9320128SIngo Weinhold /* extern pthread_mutexattr_t pthread_mutexattr_default; */ 97f924ff50SAxel Dörfler 98a635399bSAxel Dörfler /* private structure */ 99a635399bSAxel Dörfler struct __pthread_cleanup_handler { 100a635399bSAxel Dörfler struct __pthread_cleanup_handler *previous; 101a635399bSAxel Dörfler void (*function)(void *argument); 102a635399bSAxel Dörfler void *argument; 103a635399bSAxel Dörfler }; 104a635399bSAxel Dörfler 105a635399bSAxel Dörfler #define pthread_cleanup_push(func, arg) \ 106a635399bSAxel Dörfler do { \ 107a635399bSAxel Dörfler struct __pthread_cleanup_handler __handler; \ 108a635399bSAxel Dörfler __handler.function = (func); \ 109a635399bSAxel Dörfler __handler.argument = (arg); \ 110a635399bSAxel Dörfler __pthread_cleanup_push_handler(&__handler); 111a635399bSAxel Dörfler 112a635399bSAxel Dörfler #define pthread_cleanup_pop(execute) \ 113a635399bSAxel Dörfler if (execute) \ 114a635399bSAxel Dörfler __handler.function(__handler.argument); \ 115a635399bSAxel Dörfler __pthread_cleanup_pop_handler(); \ 116a635399bSAxel Dörfler } while (0) 117a635399bSAxel Dörfler 118a635399bSAxel Dörfler 11945b820ddSAxel Dörfler #ifdef __cplusplus 12045b820ddSAxel Dörfler extern "C" { 12145b820ddSAxel Dörfler #endif 12245b820ddSAxel Dörfler 123f924ff50SAxel Dörfler extern pthread_mutex_t _pthread_mutex_static_initializer(void); 124f924ff50SAxel Dörfler extern pthread_mutex_t _pthread_recursive_mutex_static_initializer(void); 125954f408fSJérôme Duval #define PTHREAD_MUTEX_INITIALIZER NULL 126f924ff50SAxel Dörfler #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER \ 127f924ff50SAxel Dörfler pthread_recursive_mutex_static_initializer(); 128f924ff50SAxel Dörfler 129550a30a0SRyan Leavengood extern pthread_cond_t _pthread_cond_static_initializer(void); 130550a30a0SRyan Leavengood #define PTHREAD_COND_INITIALIZER _pthread_cond_static_initializer(); 131550a30a0SRyan Leavengood 132f924ff50SAxel Dörfler /* mutex functions */ 133f924ff50SAxel Dörfler extern int pthread_mutex_destroy(pthread_mutex_t *mutex); 134945fb7e3SAxel Dörfler extern int pthread_mutex_getprioceiling(pthread_mutex_t *mutex, 135945fb7e3SAxel Dörfler int *_priorityCeiling); 136945fb7e3SAxel Dörfler extern int pthread_mutex_init(pthread_mutex_t *mutex, 137945fb7e3SAxel Dörfler const pthread_mutexattr_t *attr); 138f924ff50SAxel Dörfler extern int pthread_mutex_lock(pthread_mutex_t *mutex); 139945fb7e3SAxel Dörfler extern int pthread_mutex_setprioceiling(pthread_mutex_t *mutex, 140945fb7e3SAxel Dörfler int newPriorityCeiling, int *_oldPriorityCeiling); 141945fb7e3SAxel Dörfler extern int pthread_mutex_timedlock(pthread_mutex_t *mutex, 142945fb7e3SAxel Dörfler const struct timespec *spec); 143f924ff50SAxel Dörfler extern int pthread_mutex_trylock(pthread_mutex_t *mutex); 144f924ff50SAxel Dörfler extern int pthread_mutex_unlock(pthread_mutex_t *mutex); 145f924ff50SAxel Dörfler 146f924ff50SAxel Dörfler /* mutex attribute functions */ 147f924ff50SAxel Dörfler extern int pthread_mutexattr_destroy(pthread_mutexattr_t *mutexAttr); 148945fb7e3SAxel Dörfler extern int pthread_mutexattr_getprioceiling(pthread_mutexattr_t *mutexAttr, 149945fb7e3SAxel Dörfler int *_priorityCeiling); 150945fb7e3SAxel Dörfler extern int pthread_mutexattr_getprotocol(pthread_mutexattr_t *mutexAttr, 151945fb7e3SAxel Dörfler int *_protocol); 152945fb7e3SAxel Dörfler extern int pthread_mutexattr_getpshared(pthread_mutexattr_t *mutexAttr, 153945fb7e3SAxel Dörfler int *_processShared); 154945fb7e3SAxel Dörfler extern int pthread_mutexattr_gettype(pthread_mutexattr_t *mutexAttr, 155945fb7e3SAxel Dörfler int *_type); 156f924ff50SAxel Dörfler extern int pthread_mutexattr_init(pthread_mutexattr_t *mutexAttr); 157945fb7e3SAxel Dörfler extern int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *mutexAttr, 158945fb7e3SAxel Dörfler int priorityCeiling); 159945fb7e3SAxel Dörfler extern int pthread_mutexattr_setprotocol(pthread_mutexattr_t *mutexAttr, 160945fb7e3SAxel Dörfler int protocol); 161945fb7e3SAxel Dörfler extern int pthread_mutexattr_setpshared(pthread_mutexattr_t *mutexAttr, 162945fb7e3SAxel Dörfler int processShared); 163f924ff50SAxel Dörfler extern int pthread_mutexattr_settype(pthread_mutexattr_t *mutexAttr, int type); 164f924ff50SAxel Dörfler 165550a30a0SRyan Leavengood /* condition variable functions */ 166550a30a0SRyan Leavengood extern int pthread_cond_destroy(pthread_cond_t *cond); 167945fb7e3SAxel Dörfler extern int pthread_cond_init(pthread_cond_t *cond, 168945fb7e3SAxel Dörfler const pthread_condattr_t *attr); 169550a30a0SRyan Leavengood extern int pthread_cond_broadcast(pthread_cond_t *cond); 170550a30a0SRyan Leavengood extern int pthread_cond_signal(pthread_cond_t *cond); 171550a30a0SRyan Leavengood extern int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, 172550a30a0SRyan Leavengood const struct timespec *abstime); 173550a30a0SRyan Leavengood extern int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 174550a30a0SRyan Leavengood 175550a30a0SRyan Leavengood /* condition variable attribute functions */ 176550a30a0SRyan Leavengood extern int pthread_condattr_destroy(pthread_condattr_t *condAttr); 177550a30a0SRyan Leavengood extern int pthread_condattr_init(pthread_condattr_t *condAttr); 178945fb7e3SAxel Dörfler extern int pthread_condattr_getpshared(const pthread_condattr_t *condAttr, 179945fb7e3SAxel Dörfler int *processShared); 180945fb7e3SAxel Dörfler extern int pthread_condattr_setpshared(pthread_condattr_t *condAttr, 181945fb7e3SAxel Dörfler int processShared); 182550a30a0SRyan Leavengood 183*370602bfSIngo Weinhold /* rwlock functions */ 184*370602bfSIngo Weinhold extern int pthread_rwlock_init(pthread_rwlock_t *lock, 185*370602bfSIngo Weinhold const pthread_rwlockattr_t *attr); 186*370602bfSIngo Weinhold extern int pthread_rwlock_destroy(pthread_rwlock_t *lock); 187*370602bfSIngo Weinhold extern int pthread_rwlock_rdlock(pthread_rwlock_t *lock); 188*370602bfSIngo Weinhold extern int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock); 189*370602bfSIngo Weinhold extern int pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, 190*370602bfSIngo Weinhold const struct timespec *timeout); 191*370602bfSIngo Weinhold extern int pthread_rwlock_wrlock(pthread_rwlock_t *lock); 192*370602bfSIngo Weinhold extern int pthread_rwlock_trywrlock(pthread_rwlock_t *lock); 193*370602bfSIngo Weinhold extern int pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, 194*370602bfSIngo Weinhold const struct timespec *timeout); 195*370602bfSIngo Weinhold extern int pthread_rwlock_unlock(pthread_rwlock_t *lock); 196*370602bfSIngo Weinhold 197*370602bfSIngo Weinhold /* rwlock attribute functions */ 198*370602bfSIngo Weinhold extern int pthread_rwlockattr_init(pthread_rwlockattr_t *attr); 199*370602bfSIngo Weinhold extern int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr); 200*370602bfSIngo Weinhold extern int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, 201*370602bfSIngo Weinhold int *shared); 202*370602bfSIngo Weinhold extern int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, 203*370602bfSIngo Weinhold int shared); 204*370602bfSIngo Weinhold 20545b820ddSAxel Dörfler /* misc. functions */ 206945fb7e3SAxel Dörfler extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), 207945fb7e3SAxel Dörfler void (*child)(void)); 208d2d67247SJérôme Duval extern int pthread_once(pthread_once_t *once_control, void (*init_routine)()); 20945b820ddSAxel Dörfler 210a00ed9faSJérôme Duval /* thread attributes functions */ 211a00ed9faSJérôme Duval extern int pthread_attr_destroy(pthread_attr_t *attr); 212a00ed9faSJérôme Duval extern int pthread_attr_init(pthread_attr_t *attr); 213945fb7e3SAxel Dörfler extern int pthread_attr_getdetachstate(const pthread_attr_t *attr, 214945fb7e3SAxel Dörfler int *detachstate); 215a00ed9faSJérôme Duval extern int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); 216f7cc12b3SIngo Weinhold extern int pthread_attr_getstacksize(const pthread_attr_t *attr, 217f7cc12b3SIngo Weinhold size_t *stacksize); 218f7cc12b3SIngo Weinhold extern int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); 219f7cc12b3SIngo Weinhold 220f7cc12b3SIngo Weinhold #if 0 /* Unimplemented attribute functions: */ 221f7cc12b3SIngo Weinhold 222b9320128SIngo Weinhold /* mandatory! */ 223f7cc12b3SIngo Weinhold extern int pthread_attr_getschedparam(const pthread_attr_t *attr, 224f7cc12b3SIngo Weinhold struct sched_param *param); 225f7cc12b3SIngo Weinhold extern int pthread_attr_setschedparam(pthread_attr_t *attr, 226f7cc12b3SIngo Weinhold const struct sched_param *param); 227f7cc12b3SIngo Weinhold 228b9320128SIngo Weinhold /* [TPS] */ 229f7cc12b3SIngo Weinhold extern int pthread_attr_getinheritsched(const pthread_attr_t *attr, 230f7cc12b3SIngo Weinhold int *inheritsched); 231f7cc12b3SIngo Weinhold extern int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched); 232f7cc12b3SIngo Weinhold 233f7cc12b3SIngo Weinhold extern int pthread_attr_getschedpolicy(const pthread_attr_t *attr, 234f7cc12b3SIngo Weinhold int *policy); 235f7cc12b3SIngo Weinhold extern int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); 236f7cc12b3SIngo Weinhold extern int pthread_attr_getscope(const pthread_attr_t *attr, 237f7cc12b3SIngo Weinhold int *contentionscope); 238f7cc12b3SIngo Weinhold extern int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope); 239f7cc12b3SIngo Weinhold 240b9320128SIngo Weinhold /* [XSI] */ 241f7cc12b3SIngo Weinhold extern int pthread_attr_getguardsize(const pthread_attr_t *attr, 242f7cc12b3SIngo Weinhold size_t *guardsize); 243f7cc12b3SIngo Weinhold extern int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize); 244f7cc12b3SIngo Weinhold 245b9320128SIngo Weinhold /* [TSA] */ 246f7cc12b3SIngo Weinhold extern int pthread_attr_getstackaddr(const pthread_attr_t *attr, 247f7cc12b3SIngo Weinhold void **stackaddr); 248f7cc12b3SIngo Weinhold extern int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr); 249f7cc12b3SIngo Weinhold 250b9320128SIngo Weinhold /* [TSA TSS] */ 251f7cc12b3SIngo Weinhold extern int pthread_attr_getstack(const pthread_attr_t *attr, 252f7cc12b3SIngo Weinhold void **stackaddr, size_t *stacksize); 253f7cc12b3SIngo Weinhold extern int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize); 254f7cc12b3SIngo Weinhold 255f7cc12b3SIngo Weinhold #endif /* 0 */ 256f7cc12b3SIngo Weinhold 257a00ed9faSJérôme Duval 258c80e6107SAxel Dörfler /* thread functions */ 259a00ed9faSJérôme Duval extern int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 260a00ed9faSJérôme Duval void *(*start_routine)(void*), void *arg); 261a00ed9faSJérôme Duval extern int pthread_detach(pthread_t thread); 262a00ed9faSJérôme Duval extern int pthread_equal(pthread_t t1, pthread_t t2); 263a00ed9faSJérôme Duval extern void pthread_exit(void *value_ptr); 264c80e6107SAxel Dörfler extern int pthread_join(pthread_t thread, void **_value); 265a00ed9faSJérôme Duval extern pthread_t pthread_self(void); 266ad6ada0bSJérôme Duval extern int pthread_kill(pthread_t thread, int sig); 267b9fe86d2SAxel Dörfler extern int pthread_getconcurrency(void); 268b9fe86d2SAxel Dörfler extern int pthread_setconcurrency(int newLevel); 269ad6ada0bSJérôme Duval 270c80e6107SAxel Dörfler extern int pthread_cancel(pthread_t thread); 271c80e6107SAxel Dörfler extern int pthread_setcancelstate(int state, int *_oldState); 272c80e6107SAxel Dörfler extern int pthread_setcanceltype(int type, int *_oldType); 273c80e6107SAxel Dörfler extern void pthread_testcancel(void); 274c80e6107SAxel Dörfler 2751f11178fSJérôme Duval /* thread specific data functions */ 276945fb7e3SAxel Dörfler extern int pthread_key_create(pthread_key_t *key, 277945fb7e3SAxel Dörfler void (*destructorFunc)(void*)); 2781f11178fSJérôme Duval extern int pthread_key_delete(pthread_key_t key); 2791f11178fSJérôme Duval extern void *pthread_getspecific(pthread_key_t key); 2801f11178fSJérôme Duval extern int pthread_setspecific(pthread_key_t key, const void *value); 2811f11178fSJérôme Duval 282a635399bSAxel Dörfler /* private functions */ 283a635399bSAxel Dörfler extern void __pthread_cleanup_push_handler( 284a635399bSAxel Dörfler struct __pthread_cleanup_handler *handler); 285a635399bSAxel Dörfler extern struct __pthread_cleanup_handler *__pthread_cleanup_pop_handler(void); 286a635399bSAxel Dörfler 28745b820ddSAxel Dörfler #ifdef __cplusplus 28845b820ddSAxel Dörfler } 28945b820ddSAxel Dörfler #endif 29045b820ddSAxel Dörfler 291f924ff50SAxel Dörfler #endif /* _PTHREAD_ */ 292