/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2014 Garrett D'Amore * Copyright 2018 Joyent, Inc. * * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _PTHREAD_H #define _PTHREAD_H #include #ifndef _ASM #include #include #include #endif /* _ASM */ #ifdef __cplusplus extern "C" { #endif /* * Thread related attribute values defined as in thread.h. * These are defined as bit pattern in thread.h. * Any change here should be reflected in thread.h. */ /* detach */ #define PTHREAD_CREATE_DETACHED 0x40 /* = THR_DETACHED */ #define PTHREAD_CREATE_JOINABLE 0 /* scope */ #define PTHREAD_SCOPE_SYSTEM 0x01 /* = THR_BOUND */ #define PTHREAD_SCOPE_PROCESS 0 /* * Other attributes which are not defined in thread.h */ /* inherit */ #define PTHREAD_INHERIT_SCHED 1 #define PTHREAD_EXPLICIT_SCHED 0 /* * Value of process-shared attribute * These are defined as values defined in sys/synch.h * Any change here should be reflected in sys/synch.h. */ #define PTHREAD_PROCESS_SHARED 1 /* = USYNC_PROCESS */ #define PTHREAD_PROCESS_PRIVATE 0 /* = USYNC_THREAD */ /* * mutex types * keep these in synch which sys/synch.h lock flags */ #define PTHREAD_MUTEX_NORMAL 0x0 #define PTHREAD_MUTEX_ERRORCHECK 0x2 #define PTHREAD_MUTEX_RECURSIVE 0x4 #define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL /* * Mutex protocol values. Keep these in synch with sys/synch.h lock types. */ #define PTHREAD_PRIO_NONE 0x0 #define PTHREAD_PRIO_INHERIT 0x10 #define PTHREAD_PRIO_PROTECT 0x20 /* * Mutex robust attribute values. * Keep these in synch with sys/synch.h lock types. */ #define PTHREAD_MUTEX_STALLED 0x0 #define PTHREAD_MUTEX_ROBUST 0x40 /* * Historical solaris-specific names, * from before pthread_mutexattr_getrobust() became standardized */ #define PTHREAD_MUTEX_STALL_NP PTHREAD_MUTEX_STALLED #define PTHREAD_MUTEX_ROBUST_NP PTHREAD_MUTEX_ROBUST /* * macros - default initializers defined as in synch.h * Any change here should be reflected in synch.h. * * NOTE: * Make sure that any change in the macros is consistent with the definition * of the corresponding types in sys/types.h (e.g. PTHREAD_MUTEX_INITIALIZER * should be consistent with the definition for pthread_mutex_t). */ #define PTHREAD_MUTEX_INITIALIZER /* = DEFAULTMUTEX */ \ {{0, 0, 0, PTHREAD_PROCESS_PRIVATE, _MUTEX_MAGIC}, {{{0}}}, 0} #define PTHREAD_COND_INITIALIZER /* = DEFAULTCV */ \ {{{0, 0, 0, 0}, PTHREAD_PROCESS_PRIVATE, _COND_MAGIC}, 0} #define PTHREAD_RWLOCK_INITIALIZER /* = DEFAULTRWLOCK */ \ {0, PTHREAD_PROCESS_PRIVATE, _RWL_MAGIC, PTHREAD_MUTEX_INITIALIZER, \ PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER} /* cancellation type and state */ #define PTHREAD_CANCEL_ENABLE 0x00 #define PTHREAD_CANCEL_DISABLE 0x01 #define PTHREAD_CANCEL_DEFERRED 0x00 #define PTHREAD_CANCEL_ASYNCHRONOUS 0x02 #define PTHREAD_CANCELED (void *)-19 /* pthread_once related values */ #define PTHREAD_ONCE_NOTDONE 0 #define PTHREAD_ONCE_DONE 1 #define PTHREAD_ONCE_INIT { {0, 0, 0, PTHREAD_ONCE_NOTDONE} } /* * The key to be created by pthread_key_create_once_np() * must be statically initialized with PTHREAD_ONCE_KEY_NP. * This must be the same as THR_ONCE_KEY in */ #define PTHREAD_ONCE_KEY_NP (pthread_key_t)(-1) /* barriers */ #define PTHREAD_BARRIER_SERIAL_THREAD -2 /* For pthread_{get,set}name_np(). */ #define PTHREAD_MAX_NAMELEN_NP (32) #ifndef _ASM /* * cancellation cleanup structure */ typedef struct _cleanup { uintptr_t pthread_cleanup_pad[4]; } _cleanup_t; void __pthread_cleanup_push(void (*)(void *), void *, caddr_t, _cleanup_t *); void __pthread_cleanup_pop(int, _cleanup_t *); caddr_t _getfp(void); #if __cplusplus extern "C" { #endif typedef void (*_Voidfp)(void*); /* pointer to extern "C" function */ #if __cplusplus } /* extern "C" */ #endif #define pthread_cleanup_push(routine, args) { \ _cleanup_t _cleanup_info; \ __pthread_cleanup_push((_Voidfp)(routine), (void *)(args), \ (caddr_t)_getfp(), &_cleanup_info); #define pthread_cleanup_pop(ex) \ __pthread_cleanup_pop(ex, &_cleanup_info); \ } /* * function prototypes - thread related calls */ /* * pthread_atfork() is also declared in as per SUSv2. The * declarations are identical. A change to either one may also require * appropriate namespace updates in order to avoid redeclaration * warnings in the case where both prototypes are exposed via inclusion * of both and . */ extern int pthread_atfork(void (*) (void), void (*) (void), void (*) (void)); extern int pthread_attr_init(pthread_attr_t *); extern int pthread_attr_destroy(pthread_attr_t *); extern int pthread_attr_setstack(pthread_attr_t *, void *, size_t); extern int pthread_attr_getstack(const pthread_attr_t *_RESTRICT_KYWD, void **_RESTRICT_KYWD, size_t *_RESTRICT_KYWD); extern int pthread_attr_setstacksize(pthread_attr_t *, size_t); extern int pthread_attr_getstacksize(const pthread_attr_t *_RESTRICT_KYWD, size_t *_RESTRICT_KYWD); extern int pthread_attr_setstackaddr(pthread_attr_t *, void *); extern int pthread_attr_getstackaddr(const pthread_attr_t *_RESTRICT_KYWD, void **_RESTRICT_KYWD); extern int pthread_attr_setdetachstate(pthread_attr_t *, int); extern int pthread_attr_getdetachstate(const pthread_attr_t *, int *); extern int pthread_attr_setscope(pthread_attr_t *, int); extern int pthread_attr_getscope(const pthread_attr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_attr_setinheritsched(pthread_attr_t *, int); extern int pthread_attr_getinheritsched(const pthread_attr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_attr_setschedpolicy(pthread_attr_t *, int); extern int pthread_attr_getschedpolicy(const pthread_attr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_attr_setschedparam(pthread_attr_t *_RESTRICT_KYWD, const struct sched_param *_RESTRICT_KYWD); extern int pthread_attr_getschedparam(const pthread_attr_t *_RESTRICT_KYWD, struct sched_param *_RESTRICT_KYWD); extern int pthread_attr_setname_np(pthread_attr_t *_RESTRICT_KYWD, const char *_RESTRICT_KYWD); extern int pthread_attr_getname_np(pthread_attr_t *_RESTRICT_KYWD, char *_RESTRICT_KYWD, size_t); extern int pthread_create(pthread_t *_RESTRICT_KYWD, const pthread_attr_t *_RESTRICT_KYWD, void * (*)(void *), void *_RESTRICT_KYWD); extern int pthread_once(pthread_once_t *, void (*)(void)); extern int pthread_join(pthread_t, void **); extern int pthread_detach(pthread_t); extern void pthread_exit(void *) __NORETURN; extern int pthread_cancel(pthread_t); extern int pthread_setschedparam(pthread_t, int, const struct sched_param *); extern int pthread_getschedparam(pthread_t, int *_RESTRICT_KYWD, struct sched_param *_RESTRICT_KYWD); extern int pthread_setschedprio(pthread_t, int); extern int pthread_setcancelstate(int, int *); extern int pthread_setcanceltype(int, int *); extern void pthread_testcancel(void); extern int pthread_equal(pthread_t, pthread_t); extern int pthread_key_create(pthread_key_t *, void (*)(void *)); extern int pthread_key_create_once_np(pthread_key_t *, void (*)(void *)); extern int pthread_key_delete(pthread_key_t); extern int pthread_setspecific(pthread_key_t, const void *); extern void *pthread_getspecific(pthread_key_t); extern pthread_t pthread_self(void); extern int pthread_setname_np(pthread_t, const char *); extern int pthread_getname_np(pthread_t, char *, size_t); /* * function prototypes - synchronization related calls */ extern int pthread_mutexattr_init(pthread_mutexattr_t *); extern int pthread_mutexattr_destroy(pthread_mutexattr_t *); extern int pthread_mutexattr_setpshared(pthread_mutexattr_t *, int); extern int pthread_mutexattr_getpshared( const pthread_mutexattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_mutexattr_setprotocol(pthread_mutexattr_t *, int); extern int pthread_mutexattr_getprotocol( const pthread_mutexattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *, int); extern int pthread_mutexattr_getprioceiling( const pthread_mutexattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_mutexattr_setrobust(pthread_mutexattr_t *, int); extern int pthread_mutexattr_getrobust( const pthread_mutexattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_mutex_init(pthread_mutex_t *_RESTRICT_KYWD, const pthread_mutexattr_t *_RESTRICT_KYWD); extern int pthread_mutex_consistent(pthread_mutex_t *); extern int pthread_mutex_destroy(pthread_mutex_t *); extern int pthread_mutex_lock(pthread_mutex_t *); extern int pthread_mutex_timedlock(pthread_mutex_t *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD); extern int pthread_mutex_reltimedlock_np(pthread_mutex_t *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD); extern int pthread_mutex_unlock(pthread_mutex_t *); extern int pthread_mutex_trylock(pthread_mutex_t *); extern int pthread_mutex_setprioceiling(pthread_mutex_t *_RESTRICT_KYWD, int, int *_RESTRICT_KYWD); extern int pthread_mutex_getprioceiling(const pthread_mutex_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_condattr_init(pthread_condattr_t *); extern int pthread_condattr_destroy(pthread_condattr_t *); extern int pthread_condattr_setclock(pthread_condattr_t *, clockid_t); extern int pthread_condattr_getclock(const pthread_condattr_t *_RESTRICT_KYWD, clockid_t *_RESTRICT_KYWD); extern int pthread_condattr_setpshared(pthread_condattr_t *, int); extern int pthread_condattr_getpshared(const pthread_condattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_cond_init(pthread_cond_t *_RESTRICT_KYWD, const pthread_condattr_t *_RESTRICT_KYWD); extern int pthread_cond_destroy(pthread_cond_t *); extern int pthread_cond_broadcast(pthread_cond_t *); extern int pthread_cond_signal(pthread_cond_t *); extern int pthread_cond_wait(pthread_cond_t *_RESTRICT_KYWD, pthread_mutex_t *_RESTRICT_KYWD); extern int pthread_cond_timedwait(pthread_cond_t *_RESTRICT_KYWD, pthread_mutex_t *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD); extern int pthread_cond_reltimedwait_np(pthread_cond_t *_RESTRICT_KYWD, pthread_mutex_t *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD); extern int pthread_attr_getguardsize(const pthread_attr_t *_RESTRICT_KYWD, size_t *_RESTRICT_KYWD); extern int pthread_attr_setguardsize(pthread_attr_t *, size_t); extern int pthread_getconcurrency(void); extern int pthread_setconcurrency(int); extern int pthread_mutexattr_settype(pthread_mutexattr_t *, int); extern int pthread_mutexattr_gettype(const pthread_mutexattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_rwlock_init(pthread_rwlock_t *_RESTRICT_KYWD, const pthread_rwlockattr_t *_RESTRICT_KYWD); extern int pthread_rwlock_destroy(pthread_rwlock_t *); extern int pthread_rwlock_rdlock(pthread_rwlock_t *); extern int pthread_rwlock_timedrdlock(pthread_rwlock_t *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD); extern int pthread_rwlock_reltimedrdlock_np(pthread_rwlock_t *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD); extern int pthread_rwlock_tryrdlock(pthread_rwlock_t *); extern int pthread_rwlock_wrlock(pthread_rwlock_t *); extern int pthread_rwlock_timedwrlock(pthread_rwlock_t *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD); extern int pthread_rwlock_reltimedwrlock_np(pthread_rwlock_t *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD); extern int pthread_rwlock_trywrlock(pthread_rwlock_t *); extern int pthread_rwlock_unlock(pthread_rwlock_t *); extern int pthread_rwlockattr_init(pthread_rwlockattr_t *); extern int pthread_rwlockattr_destroy(pthread_rwlockattr_t *); extern int pthread_rwlockattr_getpshared( const pthread_rwlockattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int); extern int pthread_spin_init(pthread_spinlock_t *, int); extern int pthread_spin_destroy(pthread_spinlock_t *); extern int pthread_spin_lock(pthread_spinlock_t *); extern int pthread_spin_trylock(pthread_spinlock_t *); extern int pthread_spin_unlock(pthread_spinlock_t *); extern int pthread_barrierattr_init(pthread_barrierattr_t *); extern int pthread_barrierattr_destroy(pthread_barrierattr_t *); extern int pthread_barrierattr_setpshared(pthread_barrierattr_t *, int); extern int pthread_barrierattr_getpshared( const pthread_barrierattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); extern int pthread_barrier_init(pthread_barrier_t *_RESTRICT_KYWD, const pthread_barrierattr_t *_RESTRICT_KYWD, uint_t); extern int pthread_barrier_destroy(pthread_barrier_t *); extern int pthread_barrier_wait(pthread_barrier_t *); /* Historical names -- present only for binary compatibility */ extern int pthread_mutex_consistent_np(pthread_mutex_t *); extern int pthread_mutexattr_setrobust_np(pthread_mutexattr_t *, int); extern int pthread_mutexattr_getrobust_np( const pthread_mutexattr_t *_RESTRICT_KYWD, int *_RESTRICT_KYWD); /* * These are non-standardized extensions that we provide. Their origins are * documented in their manual pages. */ #if !defined(_STRICT_SYMBOLS) || defined(__EXTENSIONS__) extern int pthread_attr_get_np(pthread_t, pthread_attr_t *); #endif /* !_STRICT_SYMBOLS || __EXTENSIONS__ */ #endif /* _ASM */ #ifdef __cplusplus } #endif #endif /* _PTHREAD_H */