pthread.h revision 179662
1210284Sjmallett/* 2232812Sjmallett * Copyright (c) 1993, 1994 by Chris Provenzano, proven@mit.edu 3215990Sjmallett * Copyright (c) 1995-1998 by John Birrell <jb@cimlogic.com.au> 4210284Sjmallett * All rights reserved. 5210284Sjmallett * 6215990Sjmallett * Redistribution and use in source and binary forms, with or without 7215990Sjmallett * modification, are permitted provided that the following conditions 8215990Sjmallett * are met: 9210284Sjmallett * 1. Redistributions of source code must retain the above copyright 10215990Sjmallett * notice, this list of conditions and the following disclaimer. 11215990Sjmallett * 2. Redistributions in binary form must reproduce the above copyright 12210284Sjmallett * notice, this list of conditions and the following disclaimer in the 13215990Sjmallett * documentation and/or other materials provided with the distribution. 14215990Sjmallett * 3. All advertising materials mentioning features or use of this software 15215990Sjmallett * must display the following acknowledgement: 16215990Sjmallett * This product includes software developed by Chris Provenzano. 17215990Sjmallett * 4. The name of Chris Provenzano may not be used to endorse or promote 18232812Sjmallett * products derived from this software without specific prior written 19215990Sjmallett * permission. 20215990Sjmallett * 21215990Sjmallett * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND 22215990Sjmallett * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23215990Sjmallett * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24215990Sjmallett * ARE DISCLAIMED. IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY 25215990Sjmallett * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26215990Sjmallett * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27215990Sjmallett * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28215990Sjmallett * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29232812Sjmallett * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30215990Sjmallett * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31215990Sjmallett * SUCH DAMAGE. 32215990Sjmallett * 33215990Sjmallett * $FreeBSD: head/include/pthread.h 179662 2008-06-09 01:14:10Z davidxu $ 34215990Sjmallett */ 35215990Sjmallett#ifndef _PTHREAD_H_ 36215990Sjmallett#define _PTHREAD_H_ 37215990Sjmallett 38210284Sjmallett/* 39210284Sjmallett * Header files. 40210284Sjmallett */ 41215990Sjmallett#include <sys/cdefs.h> 42210284Sjmallett#include <sys/_pthreadtypes.h> 43210284Sjmallett#include <machine/_limits.h> 44210284Sjmallett#include <machine/_types.h> 45210284Sjmallett#include <sys/_sigset.h> 46210284Sjmallett#include <sched.h> 47210284Sjmallett#include <time.h> 48210284Sjmallett 49210284Sjmallett/* 50210284Sjmallett * Run-time invariant values: 51210284Sjmallett */ 52210284Sjmallett#define PTHREAD_DESTRUCTOR_ITERATIONS 4 53210284Sjmallett#define PTHREAD_KEYS_MAX 256 54215990Sjmallett#define PTHREAD_STACK_MIN __MINSIGSTKSZ 55215990Sjmallett#define PTHREAD_THREADS_MAX __ULONG_MAX 56210284Sjmallett#define PTHREAD_BARRIER_SERIAL_THREAD -1 57210284Sjmallett 58210284Sjmallett/* 59210284Sjmallett * Flags for threads and thread attributes. 60210284Sjmallett */ 61210284Sjmallett#define PTHREAD_DETACHED 0x1 62215990Sjmallett#define PTHREAD_SCOPE_SYSTEM 0x2 63215990Sjmallett#define PTHREAD_INHERIT_SCHED 0x4 64210284Sjmallett#define PTHREAD_NOFLOAT 0x8 65210284Sjmallett 66210284Sjmallett#define PTHREAD_CREATE_DETACHED PTHREAD_DETACHED 67215990Sjmallett#define PTHREAD_CREATE_JOINABLE 0 68210284Sjmallett#define PTHREAD_SCOPE_PROCESS 0 69210284Sjmallett#define PTHREAD_EXPLICIT_SCHED 0 70210284Sjmallett 71210284Sjmallett/* 72210284Sjmallett * Flags for read/write lock attributes 73210284Sjmallett */ 74210284Sjmallett#define PTHREAD_PROCESS_PRIVATE 0 75210284Sjmallett#define PTHREAD_PROCESS_SHARED 1 76210284Sjmallett 77210284Sjmallett/* 78210284Sjmallett * Flags for cancelling threads 79210284Sjmallett */ 80210284Sjmallett#define PTHREAD_CANCEL_ENABLE 0 81210284Sjmallett#define PTHREAD_CANCEL_DISABLE 1 82210284Sjmallett#define PTHREAD_CANCEL_DEFERRED 0 83210284Sjmallett#define PTHREAD_CANCEL_ASYNCHRONOUS 2 84210284Sjmallett#define PTHREAD_CANCELED ((void *) 1) 85210284Sjmallett 86210284Sjmallett/* 87210284Sjmallett * Flags for once initialization. 88210284Sjmallett */ 89210284Sjmallett#define PTHREAD_NEEDS_INIT 0 90210284Sjmallett#define PTHREAD_DONE_INIT 1 91215990Sjmallett 92210284Sjmallett/* 93210284Sjmallett * Static once initialization values. 94210284Sjmallett */ 95210284Sjmallett#define PTHREAD_ONCE_INIT { PTHREAD_NEEDS_INIT, NULL } 96210284Sjmallett 97210284Sjmallett/* 98210284Sjmallett * Static initialization values. 99210284Sjmallett */ 100210284Sjmallett#define PTHREAD_MUTEX_INITIALIZER NULL 101210284Sjmallett#define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP NULL 102210284Sjmallett#define PTHREAD_COND_INITIALIZER NULL 103210284Sjmallett#define PTHREAD_RWLOCK_INITIALIZER NULL 104210284Sjmallett 105210284Sjmallett/* 106210284Sjmallett * Default attribute arguments (draft 4, deprecated). 107210284Sjmallett */ 108210284Sjmallett#ifndef PTHREAD_KERNEL 109210284Sjmallett#define pthread_condattr_default NULL 110210284Sjmallett#define pthread_mutexattr_default NULL 111210284Sjmallett#define pthread_attr_default NULL 112210284Sjmallett#endif 113210284Sjmallett 114210284Sjmallett#define PTHREAD_PRIO_NONE 0 115210284Sjmallett#define PTHREAD_PRIO_INHERIT 1 116210284Sjmallett#define PTHREAD_PRIO_PROTECT 2 117210284Sjmallett 118210284Sjmallett/* 119210284Sjmallett * Mutex types (Single UNIX Specification, Version 2, 1997). 120210284Sjmallett * 121210284Sjmallett * Note that a mutex attribute with one of the following types: 122210284Sjmallett * 123210284Sjmallett * PTHREAD_MUTEX_NORMAL 124210284Sjmallett * PTHREAD_MUTEX_RECURSIVE 125210284Sjmallett * 126210284Sjmallett * will deviate from POSIX specified semantics. 127210284Sjmallett */ 128210284Sjmallettenum pthread_mutextype { 129210284Sjmallett PTHREAD_MUTEX_ERRORCHECK = 1, /* Default POSIX mutex */ 130210284Sjmallett PTHREAD_MUTEX_RECURSIVE = 2, /* Recursive mutex */ 131210284Sjmallett PTHREAD_MUTEX_NORMAL = 3, /* No error checking */ 132210284Sjmallett PTHREAD_MUTEX_ADAPTIVE_NP = 4, /* Adaptive mutex, spins briefly before blocking on lock */ 133210284Sjmallett PTHREAD_MUTEX_TYPE_MAX 134210284Sjmallett}; 135210284Sjmallett 136210284Sjmallett#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_ERRORCHECK 137210284Sjmallett 138210284Sjmallettstruct _pthread_cleanup_info { 139210284Sjmallett __uintptr_t pthread_cleanup_pad[8]; 140210284Sjmallett}; 141210284Sjmallett 142210284Sjmallett/* 143210284Sjmallett * Thread function prototype definitions: 144210284Sjmallett */ 145210284Sjmallett__BEGIN_DECLS 146210284Sjmallettint pthread_atfork(void (*)(void), void (*)(void), void (*)(void)); 147210284Sjmallettint pthread_attr_destroy(pthread_attr_t *); 148210284Sjmallettint pthread_attr_getstack(const pthread_attr_t * __restrict, 149210284Sjmallett void ** __restrict, size_t * __restrict); 150210284Sjmallettint pthread_attr_getstacksize(const pthread_attr_t *, size_t *); 151215990Sjmallettint pthread_attr_getguardsize(const pthread_attr_t *, size_t *); 152210284Sjmallettint pthread_attr_getstackaddr(const pthread_attr_t *, void **); 153210284Sjmallettint pthread_attr_getdetachstate(const pthread_attr_t *, int *); 154215990Sjmallettint pthread_attr_init(pthread_attr_t *); 155210284Sjmallettint pthread_attr_setstacksize(pthread_attr_t *, size_t); 156210284Sjmallettint pthread_attr_setguardsize(pthread_attr_t *, size_t); 157210284Sjmallettint pthread_attr_setstack(pthread_attr_t *, void *, size_t); 158215990Sjmallettint pthread_attr_setstackaddr(pthread_attr_t *, void *); 159210284Sjmallettint pthread_attr_setdetachstate(pthread_attr_t *, int); 160215990Sjmallettint pthread_barrier_destroy(pthread_barrier_t *); 161210284Sjmallettint pthread_barrier_init(pthread_barrier_t *, 162210284Sjmallett const pthread_barrierattr_t *, unsigned); 163210284Sjmallettint pthread_barrier_wait(pthread_barrier_t *); 164210284Sjmallettint pthread_barrierattr_destroy(pthread_barrierattr_t *); 165210284Sjmallettint pthread_barrierattr_getpshared(const pthread_barrierattr_t *, 166215990Sjmallett int *); 167210284Sjmallettint pthread_barrierattr_init(pthread_barrierattr_t *); 168210284Sjmallettint pthread_barrierattr_setpshared(pthread_barrierattr_t *, int); 169215990Sjmallett 170210284Sjmallett#define pthread_cleanup_push(cleanup_routine, cleanup_arg) \ 171210284Sjmallett { \ 172210284Sjmallett struct _pthread_cleanup_info __cleanup_info__; \ 173215990Sjmallett __pthread_cleanup_push_imp(cleanup_routine, cleanup_arg,\ 174210284Sjmallett &__cleanup_info__); \ 175215990Sjmallett { 176210284Sjmallett 177210284Sjmallett#define pthread_cleanup_pop(execute) \ 178210284Sjmallett } \ 179210284Sjmallett __pthread_cleanup_pop_imp(execute); \ 180210284Sjmallett } 181210284Sjmallett 182210284Sjmallettint pthread_condattr_destroy(pthread_condattr_t *); 183210284Sjmallettint pthread_condattr_getclock(const pthread_condattr_t *, 184210284Sjmallett clockid_t *); 185210284Sjmallettint pthread_condattr_getpshared(const pthread_condattr_t *, int *); 186210284Sjmallettint pthread_condattr_init(pthread_condattr_t *); 187210284Sjmallettint pthread_condattr_setclock(pthread_condattr_t *, clockid_t); 188210284Sjmallettint pthread_condattr_setpshared(pthread_condattr_t *, int); 189210284Sjmallettint pthread_cond_broadcast(pthread_cond_t *); 190210284Sjmallettint pthread_cond_destroy(pthread_cond_t *); 191210284Sjmallettint pthread_cond_init(pthread_cond_t *, 192210284Sjmallett const pthread_condattr_t *); 193210284Sjmallettint pthread_cond_signal(pthread_cond_t *); 194210284Sjmallettint pthread_cond_timedwait(pthread_cond_t *, 195215990Sjmallett pthread_mutex_t *, const struct timespec *); 196210284Sjmallettint pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *); 197215990Sjmallettint pthread_create(pthread_t *, const pthread_attr_t *, 198210284Sjmallett void *(*) (void *), void *); 199215990Sjmallettint pthread_detach(pthread_t); 200210284Sjmallettint pthread_equal(pthread_t, pthread_t); 201210284Sjmallettvoid pthread_exit(void *) __dead2; 202210284Sjmallettvoid *pthread_getspecific(pthread_key_t); 203210284Sjmallettint pthread_getcpuclockid(pthread_t, clockid_t *); 204210284Sjmallettint pthread_join(pthread_t, void **); 205210284Sjmallettint pthread_key_create(pthread_key_t *, 206210284Sjmallett void (*) (void *)); 207210284Sjmallettint pthread_key_delete(pthread_key_t); 208210284Sjmallettint pthread_kill(pthread_t, int); 209210284Sjmallettint pthread_mutexattr_init(pthread_mutexattr_t *); 210210284Sjmallettint pthread_mutexattr_destroy(pthread_mutexattr_t *); 211215990Sjmallettint pthread_mutexattr_getpshared(const pthread_mutexattr_t *, 212210284Sjmallett int *); 213215990Sjmallettint pthread_mutexattr_gettype(pthread_mutexattr_t *, int *); 214210284Sjmallettint pthread_mutexattr_settype(pthread_mutexattr_t *, int); 215210284Sjmallettint pthread_mutexattr_setpshared(pthread_mutexattr_t *, int); 216215990Sjmallettint pthread_mutex_destroy(pthread_mutex_t *); 217210284Sjmallettint pthread_mutex_init(pthread_mutex_t *, 218215990Sjmallett const pthread_mutexattr_t *); 219215990Sjmallettint pthread_mutex_lock(pthread_mutex_t *); 220210284Sjmallettint pthread_mutex_trylock(pthread_mutex_t *); 221210284Sjmallettint pthread_mutex_timedlock(pthread_mutex_t *, 222215990Sjmallett const struct timespec *); 223210284Sjmallettint pthread_mutex_unlock(pthread_mutex_t *); 224215990Sjmallettint pthread_once(pthread_once_t *, void (*) (void)); 225210284Sjmallettint pthread_rwlock_destroy(pthread_rwlock_t *); 226210284Sjmallettint pthread_rwlock_init(pthread_rwlock_t *, 227210284Sjmallett const pthread_rwlockattr_t *); 228215990Sjmallettint pthread_rwlock_rdlock(pthread_rwlock_t *); 229210284Sjmallettint pthread_rwlock_timedrdlock(pthread_rwlock_t *, 230210284Sjmallett const struct timespec *); 231210284Sjmallettint pthread_rwlock_timedwrlock(pthread_rwlock_t *, 232210284Sjmallett const struct timespec *); 233210284Sjmallettint pthread_rwlock_tryrdlock(pthread_rwlock_t *); 234210284Sjmallettint pthread_rwlock_trywrlock(pthread_rwlock_t *); 235210284Sjmallettint pthread_rwlock_unlock(pthread_rwlock_t *); 236210284Sjmallettint pthread_rwlock_wrlock(pthread_rwlock_t *); 237210284Sjmallettint pthread_rwlockattr_init(pthread_rwlockattr_t *); 238210284Sjmallettint pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *, 239210284Sjmallett int *); 240210284Sjmallettint pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int); 241210284Sjmallettint pthread_rwlockattr_destroy(pthread_rwlockattr_t *); 242210284Sjmallettpthread_t pthread_self(void); 243210284Sjmallettint pthread_setspecific(pthread_key_t, const void *); 244210284Sjmallettint pthread_sigmask(int, const __sigset_t *, __sigset_t *); 245210284Sjmallett 246210284Sjmallettint pthread_spin_init(pthread_spinlock_t *, int); 247210284Sjmallettint pthread_spin_destroy(pthread_spinlock_t *); 248210284Sjmallettint pthread_spin_lock(pthread_spinlock_t *); 249210284Sjmallettint pthread_spin_trylock(pthread_spinlock_t *); 250210284Sjmallettint pthread_spin_unlock(pthread_spinlock_t *); 251210284Sjmallettint pthread_cancel(pthread_t); 252210284Sjmallettint pthread_setcancelstate(int, int *); 253210284Sjmallettint pthread_setcanceltype(int, int *); 254210284Sjmallettvoid pthread_testcancel(void); 255210284Sjmallett 256210284Sjmallettint pthread_getprio(pthread_t); 257210284Sjmallettint pthread_setprio(pthread_t, int); 258210284Sjmallettvoid pthread_yield(void); 259210284Sjmallett 260210284Sjmallettint pthread_mutexattr_getprioceiling(pthread_mutexattr_t *, 261210284Sjmallett int *); 262210284Sjmallettint pthread_mutexattr_setprioceiling(pthread_mutexattr_t *, 263210284Sjmallett int); 264210284Sjmallettint pthread_mutex_getprioceiling(pthread_mutex_t *, int *); 265210284Sjmallettint pthread_mutex_setprioceiling(pthread_mutex_t *, int, int *); 266210284Sjmallett 267210284Sjmallettint pthread_mutexattr_getprotocol(pthread_mutexattr_t *, int *); 268210284Sjmallettint pthread_mutexattr_setprotocol(pthread_mutexattr_t *, int); 269210284Sjmallett 270210284Sjmallettint pthread_attr_getinheritsched(const pthread_attr_t *, int *); 271210284Sjmallettint pthread_attr_getschedparam(const pthread_attr_t *, 272210284Sjmallett struct sched_param *); 273210284Sjmallettint pthread_attr_getschedpolicy(const pthread_attr_t *, int *); 274210284Sjmallettint pthread_attr_getscope(const pthread_attr_t *, int *); 275210284Sjmallettint pthread_attr_setinheritsched(pthread_attr_t *, int); 276210284Sjmallettint pthread_attr_setschedparam(pthread_attr_t *, 277210284Sjmallett const struct sched_param *); 278210284Sjmallettint pthread_attr_setschedpolicy(pthread_attr_t *, int); 279210284Sjmallettint pthread_attr_setscope(pthread_attr_t *, int); 280210284Sjmallettint pthread_getschedparam(pthread_t pthread, int *, 281210284Sjmallett struct sched_param *); 282210284Sjmallettint pthread_setschedparam(pthread_t, int, 283210284Sjmallett const struct sched_param *); 284210284Sjmallettint pthread_getconcurrency(void); 285210284Sjmallettint pthread_setconcurrency(int); 286210284Sjmallett 287210284Sjmallettvoid __pthread_cleanup_push_imp(void (*)(void *), void *, 288210284Sjmallett struct _pthread_cleanup_info *); 289210284Sjmallettvoid __pthread_cleanup_pop_imp(int); 290210284Sjmallett__END_DECLS 291210284Sjmallett 292210284Sjmallett#endif 293210284Sjmallett