1 /* 2 * Copyright 2001-2008, Haiku Inc. All Rights Reserved. 3 * Distributed under the terms of the Haiku License. 4 */ 5 #ifndef _PTHREAD_H_ 6 #define _PTHREAD_H_ 7 8 9 #include <sched.h> 10 #include <stdint.h> 11 #include <time.h> 12 13 14 typedef struct _pthread_thread *pthread_t; 15 typedef struct _pthread_attr *pthread_attr_t; 16 typedef struct _pthread_mutex pthread_mutex_t; 17 typedef struct _pthread_mutexattr *pthread_mutexattr_t; 18 typedef struct _pthread_cond pthread_cond_t; 19 typedef struct _pthread_condattr *pthread_condattr_t; 20 typedef int pthread_key_t; 21 typedef struct _pthread_once pthread_once_t; 22 typedef struct _pthread_rwlock pthread_rwlock_t; 23 typedef struct _pthread_rwlockattr *pthread_rwlockattr_t; 24 /* 25 typedef struct _pthread_barrier *pthread_barrier_t; 26 typedef struct _pthread_barrierattr *pthread_barrierattr_t; 27 typedef struct _pthread_spinlock *pthread_spinlock_t; 28 */ 29 30 struct _pthread_mutex { 31 uint32_t flags; 32 int32_t count; 33 int32_t sem; 34 int32_t owner; 35 int32_t owner_count; 36 }; 37 38 struct _pthread_cond { 39 uint32_t flags; 40 int32_t sem; 41 pthread_mutex_t *mutex; 42 int32_t waiter_count; 43 int32_t event_counter; 44 }; 45 46 struct _pthread_once { 47 int32_t state; 48 }; 49 50 struct _pthread_rwlock { 51 uint32_t flags; 52 int32_t owner; 53 union { 54 struct { 55 int32_t sem; 56 } shared; 57 struct { 58 int32_t lock_sem; 59 int32_t lock_count; 60 int32_t reader_count; 61 int32_t writer_count; 62 void* waiters[2]; 63 } local; 64 }; 65 }; 66 67 #define PTHREAD_MUTEX_DEFAULT 0 68 #define PTHREAD_MUTEX_NORMAL 1 69 #define PTHREAD_MUTEX_ERRORCHECK 2 70 #define PTHREAD_MUTEX_RECURSIVE 3 71 72 #define PTHREAD_PROCESS_PRIVATE 0 73 #define PTHREAD_PROCESS_SHARED 1 74 75 /* 76 * Flags for threads and thread attributes. 77 */ 78 #define PTHREAD_DETACHED 0x1 79 #define PTHREAD_SCOPE_SYSTEM 0x2 80 #define PTHREAD_INHERIT_SCHED 0x4 81 #define PTHREAD_NOFLOAT 0x8 82 83 #define PTHREAD_CREATE_DETACHED PTHREAD_DETACHED 84 #define PTHREAD_CREATE_JOINABLE 0 85 #define PTHREAD_SCOPE_PROCESS 0 86 #define PTHREAD_EXPLICIT_SCHED 0 87 88 /* 89 * Flags for cancelling threads 90 */ 91 #define PTHREAD_CANCEL_ENABLE 0 92 #define PTHREAD_CANCEL_DISABLE 1 93 #define PTHREAD_CANCEL_DEFERRED 0 94 #define PTHREAD_CANCEL_ASYNCHRONOUS 2 95 #define PTHREAD_CANCELED ((void *) 1) 96 97 #define PTHREAD_ONCE_INIT { -1 } 98 99 #define PTHREAD_BARRIER_SERIAL_THREAD -1 100 #define PTHREAD_PRIO_NONE 0 101 #define PTHREAD_PRIO_INHERIT 1 102 #define PTHREAD_PRIO_PROTECT 2 103 104 /* private structure */ 105 struct __pthread_cleanup_handler { 106 struct __pthread_cleanup_handler *previous; 107 void (*function)(void *argument); 108 void *argument; 109 }; 110 111 #define pthread_cleanup_push(func, arg) \ 112 do { \ 113 struct __pthread_cleanup_handler __handler; \ 114 __handler.function = (func); \ 115 __handler.argument = (arg); \ 116 __pthread_cleanup_push_handler(&__handler); 117 118 #define pthread_cleanup_pop(execute) \ 119 if (execute) \ 120 __handler.function(__handler.argument); \ 121 __pthread_cleanup_pop_handler(); \ 122 } while (0) 123 124 125 #ifdef __cplusplus 126 extern "C" { 127 #endif 128 129 #define PTHREAD_MUTEX_INITIALIZER \ 130 { PTHREAD_MUTEX_DEFAULT, 0, -42, -1, 0 } 131 #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER \ 132 { PTHREAD_MUTEX_RECURSIVE, 0, -42, -1, 0 } 133 #define PTHREAD_COND_INITIALIZER \ 134 { 0, -42, NULL, 0, 0 } 135 136 /* mutex functions */ 137 extern int pthread_mutex_destroy(pthread_mutex_t *mutex); 138 extern int pthread_mutex_getprioceiling(pthread_mutex_t *mutex, 139 int *_priorityCeiling); 140 extern int pthread_mutex_init(pthread_mutex_t *mutex, 141 const pthread_mutexattr_t *attr); 142 extern int pthread_mutex_lock(pthread_mutex_t *mutex); 143 extern int pthread_mutex_setprioceiling(pthread_mutex_t *mutex, 144 int newPriorityCeiling, int *_oldPriorityCeiling); 145 extern int pthread_mutex_timedlock(pthread_mutex_t *mutex, 146 const struct timespec *spec); 147 extern int pthread_mutex_trylock(pthread_mutex_t *mutex); 148 extern int pthread_mutex_unlock(pthread_mutex_t *mutex); 149 150 /* mutex attribute functions */ 151 extern int pthread_mutexattr_destroy(pthread_mutexattr_t *mutexAttr); 152 extern int pthread_mutexattr_getprioceiling(pthread_mutexattr_t *mutexAttr, 153 int *_priorityCeiling); 154 extern int pthread_mutexattr_getprotocol(pthread_mutexattr_t *mutexAttr, 155 int *_protocol); 156 extern int pthread_mutexattr_getpshared(pthread_mutexattr_t *mutexAttr, 157 int *_processShared); 158 extern int pthread_mutexattr_gettype(pthread_mutexattr_t *mutexAttr, 159 int *_type); 160 extern int pthread_mutexattr_init(pthread_mutexattr_t *mutexAttr); 161 extern int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *mutexAttr, 162 int priorityCeiling); 163 extern int pthread_mutexattr_setprotocol(pthread_mutexattr_t *mutexAttr, 164 int protocol); 165 extern int pthread_mutexattr_setpshared(pthread_mutexattr_t *mutexAttr, 166 int processShared); 167 extern int pthread_mutexattr_settype(pthread_mutexattr_t *mutexAttr, int type); 168 169 /* condition variable functions */ 170 extern int pthread_cond_destroy(pthread_cond_t *cond); 171 extern int pthread_cond_init(pthread_cond_t *cond, 172 const pthread_condattr_t *attr); 173 extern int pthread_cond_broadcast(pthread_cond_t *cond); 174 extern int pthread_cond_signal(pthread_cond_t *cond); 175 extern int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, 176 const struct timespec *abstime); 177 extern int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 178 179 /* condition variable attribute functions */ 180 extern int pthread_condattr_destroy(pthread_condattr_t *condAttr); 181 extern int pthread_condattr_init(pthread_condattr_t *condAttr); 182 extern int pthread_condattr_getpshared(const pthread_condattr_t *condAttr, 183 int *processShared); 184 extern int pthread_condattr_setpshared(pthread_condattr_t *condAttr, 185 int processShared); 186 187 /* rwlock functions */ 188 extern int pthread_rwlock_init(pthread_rwlock_t *lock, 189 const pthread_rwlockattr_t *attr); 190 extern int pthread_rwlock_destroy(pthread_rwlock_t *lock); 191 extern int pthread_rwlock_rdlock(pthread_rwlock_t *lock); 192 extern int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock); 193 extern int pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, 194 const struct timespec *timeout); 195 extern int pthread_rwlock_wrlock(pthread_rwlock_t *lock); 196 extern int pthread_rwlock_trywrlock(pthread_rwlock_t *lock); 197 extern int pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, 198 const struct timespec *timeout); 199 extern int pthread_rwlock_unlock(pthread_rwlock_t *lock); 200 201 /* rwlock attribute functions */ 202 extern int pthread_rwlockattr_init(pthread_rwlockattr_t *attr); 203 extern int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr); 204 extern int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, 205 int *shared); 206 extern int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, 207 int shared); 208 209 /* misc. functions */ 210 extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), 211 void (*child)(void)); 212 extern int pthread_once(pthread_once_t *once_control, 213 void (*init_routine)(void)); 214 215 /* thread attributes functions */ 216 extern int pthread_attr_destroy(pthread_attr_t *attr); 217 extern int pthread_attr_init(pthread_attr_t *attr); 218 extern int pthread_attr_getdetachstate(const pthread_attr_t *attr, 219 int *detachstate); 220 extern int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); 221 extern int pthread_attr_getstacksize(const pthread_attr_t *attr, 222 size_t *stacksize); 223 extern int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); 224 extern int pthread_attr_getscope(const pthread_attr_t *attr, 225 int *contentionScope); 226 extern int pthread_attr_setscope(pthread_attr_t *attr, int contentionScope); 227 228 extern int pthread_attr_getschedparam(const pthread_attr_t *attr, 229 struct sched_param *param); 230 extern int pthread_attr_setschedparam(pthread_attr_t *attr, 231 const struct sched_param *param); 232 233 #if 0 /* Unimplemented attribute functions: */ 234 235 /* [TPS] */ 236 extern int pthread_attr_getinheritsched(const pthread_attr_t *attr, 237 int *inheritsched); 238 extern int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched); 239 240 extern int pthread_attr_getschedpolicy(const pthread_attr_t *attr, 241 int *policy); 242 extern int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); 243 244 /* [XSI] */ 245 extern int pthread_attr_getguardsize(const pthread_attr_t *attr, 246 size_t *guardsize); 247 extern int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize); 248 249 /* [TSA] */ 250 extern int pthread_attr_getstackaddr(const pthread_attr_t *attr, 251 void **stackaddr); 252 extern int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr); 253 254 /* [TSA TSS] */ 255 extern int pthread_attr_getstack(const pthread_attr_t *attr, 256 void **stackaddr, size_t *stacksize); 257 extern int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize); 258 259 #endif /* 0 */ 260 261 262 /* thread functions */ 263 extern int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 264 void *(*start_routine)(void*), void *arg); 265 extern int pthread_detach(pthread_t thread); 266 extern int pthread_equal(pthread_t t1, pthread_t t2); 267 extern void pthread_exit(void *value_ptr); 268 extern int pthread_join(pthread_t thread, void **_value); 269 extern pthread_t pthread_self(void); 270 extern int pthread_kill(pthread_t thread, int sig); 271 extern int pthread_getconcurrency(void); 272 extern int pthread_setconcurrency(int newLevel); 273 274 extern int pthread_cancel(pthread_t thread); 275 extern int pthread_setcancelstate(int state, int *_oldState); 276 extern int pthread_setcanceltype(int type, int *_oldType); 277 extern void pthread_testcancel(void); 278 279 extern int pthread_getschedparam(pthread_t thread, int *policy, 280 struct sched_param *param); 281 extern int pthread_setschedparam(pthread_t thread, int policy, 282 const struct sched_param *param); 283 284 /* thread specific data functions */ 285 extern int pthread_key_create(pthread_key_t *key, 286 void (*destructorFunc)(void*)); 287 extern int pthread_key_delete(pthread_key_t key); 288 extern void *pthread_getspecific(pthread_key_t key); 289 extern int pthread_setspecific(pthread_key_t key, const void *value); 290 291 /* private functions */ 292 extern void __pthread_cleanup_push_handler( 293 struct __pthread_cleanup_handler *handler); 294 extern struct __pthread_cleanup_handler *__pthread_cleanup_pop_handler(void); 295 296 #ifdef __cplusplus 297 } 298 #endif 299 300 #endif /* _PTHREAD_ */ 301