1*d1c5dc47SRobert Mustacchi /* 2*d1c5dc47SRobert Mustacchi * This file and its contents are supplied under the terms of the 3*d1c5dc47SRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0. 4*d1c5dc47SRobert Mustacchi * You may only use this file in accordance with the terms of version 5*d1c5dc47SRobert Mustacchi * 1.0 of the CDDL. 6*d1c5dc47SRobert Mustacchi * 7*d1c5dc47SRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this 8*d1c5dc47SRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at 9*d1c5dc47SRobert Mustacchi * http://www.illumos.org/license/CDDL. 10*d1c5dc47SRobert Mustacchi */ 11*d1c5dc47SRobert Mustacchi 12*d1c5dc47SRobert Mustacchi /* 13*d1c5dc47SRobert Mustacchi * Copyright 2016 Joyent, Inc. 14*d1c5dc47SRobert Mustacchi */ 15*d1c5dc47SRobert Mustacchi 16*d1c5dc47SRobert Mustacchi #ifndef _THREADS_H 17*d1c5dc47SRobert Mustacchi #define _THREADS_H 18*d1c5dc47SRobert Mustacchi 19*d1c5dc47SRobert Mustacchi /* 20*d1c5dc47SRobert Mustacchi * ISO/IEC C11 threads.h support 21*d1c5dc47SRobert Mustacchi */ 22*d1c5dc47SRobert Mustacchi 23*d1c5dc47SRobert Mustacchi #include <sys/feature_tests.h> 24*d1c5dc47SRobert Mustacchi 25*d1c5dc47SRobert Mustacchi #include <sys/types.h> 26*d1c5dc47SRobert Mustacchi #include <limits.h> 27*d1c5dc47SRobert Mustacchi #include <time.h> 28*d1c5dc47SRobert Mustacchi #include <pthread.h> 29*d1c5dc47SRobert Mustacchi 30*d1c5dc47SRobert Mustacchi #ifdef __cplusplus 31*d1c5dc47SRobert Mustacchi extern "C" { 32*d1c5dc47SRobert Mustacchi #endif 33*d1c5dc47SRobert Mustacchi 34*d1c5dc47SRobert Mustacchi #if !defined(_STRICT_SYMBOLS) || defined(_STDC_C11) 35*d1c5dc47SRobert Mustacchi 36*d1c5dc47SRobert Mustacchi #if !defined(_NORETURN_KYWD) 37*d1c5dc47SRobert Mustacchi #if __STDC_VERSION__ - 0 >= 201112L 38*d1c5dc47SRobert Mustacchi #define _NORETURN_KYWD _Noreturn 39*d1c5dc47SRobert Mustacchi #else 40*d1c5dc47SRobert Mustacchi #define _NORETURN_KYWD 41*d1c5dc47SRobert Mustacchi #endif /* __STDC_VERSION__ - 0 >= 201112L */ 42*d1c5dc47SRobert Mustacchi #endif /* !defined(_NORETURN_KYWD) */ 43*d1c5dc47SRobert Mustacchi 44*d1c5dc47SRobert Mustacchi #define thread_local _Thread_local 45*d1c5dc47SRobert Mustacchi #define ONCE_FLAG_INIT PTHREAD_ONCE_INIT 46*d1c5dc47SRobert Mustacchi #define TSS_DTOR_ITERATIONS PTHREAD_DESTRUCTOR_ITERATIONS 47*d1c5dc47SRobert Mustacchi 48*d1c5dc47SRobert Mustacchi typedef pthread_cond_t cnd_t; 49*d1c5dc47SRobert Mustacchi typedef pthread_t thrd_t; 50*d1c5dc47SRobert Mustacchi typedef pthread_key_t tss_t; 51*d1c5dc47SRobert Mustacchi typedef pthread_mutex_t mtx_t; 52*d1c5dc47SRobert Mustacchi typedef void (*tss_dtor_t)(void *); 53*d1c5dc47SRobert Mustacchi typedef int (*thrd_start_t)(void *); 54*d1c5dc47SRobert Mustacchi typedef pthread_once_t once_flag; 55*d1c5dc47SRobert Mustacchi 56*d1c5dc47SRobert Mustacchi enum { 57*d1c5dc47SRobert Mustacchi mtx_plain = 0x1, 58*d1c5dc47SRobert Mustacchi mtx_recursive = 0x2, 59*d1c5dc47SRobert Mustacchi mtx_timed = 0x4 60*d1c5dc47SRobert Mustacchi }; 61*d1c5dc47SRobert Mustacchi 62*d1c5dc47SRobert Mustacchi enum { 63*d1c5dc47SRobert Mustacchi thrd_success = 0, 64*d1c5dc47SRobert Mustacchi thrd_error = 1, 65*d1c5dc47SRobert Mustacchi thrd_busy = 2, 66*d1c5dc47SRobert Mustacchi thrd_timedout = 3, 67*d1c5dc47SRobert Mustacchi thrd_nomem = 4 68*d1c5dc47SRobert Mustacchi }; 69*d1c5dc47SRobert Mustacchi 70*d1c5dc47SRobert Mustacchi extern void call_once(once_flag *, void (*)(void)); 71*d1c5dc47SRobert Mustacchi extern int cnd_broadcast(cnd_t *); 72*d1c5dc47SRobert Mustacchi extern void cnd_destroy(cnd_t *); 73*d1c5dc47SRobert Mustacchi extern int cnd_init(cnd_t *); 74*d1c5dc47SRobert Mustacchi extern int cnd_signal(cnd_t *); 75*d1c5dc47SRobert Mustacchi extern int cnd_timedwait(cnd_t *_RESTRICT_KYWD, mtx_t *_RESTRICT_KYWD, 76*d1c5dc47SRobert Mustacchi const struct timespec *_RESTRICT_KYWD); 77*d1c5dc47SRobert Mustacchi extern int cnd_wait(cnd_t *, mtx_t *); 78*d1c5dc47SRobert Mustacchi extern void mtx_destroy(mtx_t *); 79*d1c5dc47SRobert Mustacchi extern int mtx_init(mtx_t *, int); 80*d1c5dc47SRobert Mustacchi extern int mtx_lock(mtx_t *); 81*d1c5dc47SRobert Mustacchi extern int mtx_timedlock(mtx_t *_RESTRICT_KYWD, 82*d1c5dc47SRobert Mustacchi const struct timespec *_RESTRICT_KYWD); 83*d1c5dc47SRobert Mustacchi extern int mtx_trylock(mtx_t *); 84*d1c5dc47SRobert Mustacchi extern int mtx_unlock(mtx_t *); 85*d1c5dc47SRobert Mustacchi extern int thrd_create(thrd_t *, thrd_start_t, void *); 86*d1c5dc47SRobert Mustacchi extern thrd_t thrd_current(void); 87*d1c5dc47SRobert Mustacchi extern int thrd_detach(thrd_t); 88*d1c5dc47SRobert Mustacchi extern int thrd_equal(thrd_t, thrd_t); 89*d1c5dc47SRobert Mustacchi extern _NORETURN_KYWD void thrd_exit(int) __NORETURN; 90*d1c5dc47SRobert Mustacchi extern int thrd_join(thrd_t, int *); 91*d1c5dc47SRobert Mustacchi extern int thrd_sleep(const struct timespec *, struct timespec *); 92*d1c5dc47SRobert Mustacchi extern void thrd_yield(void); 93*d1c5dc47SRobert Mustacchi extern int tss_create(tss_t *, tss_dtor_t); 94*d1c5dc47SRobert Mustacchi extern void tss_delete(tss_t); 95*d1c5dc47SRobert Mustacchi extern void *tss_get(tss_t); 96*d1c5dc47SRobert Mustacchi extern int tss_set(tss_t, void *); 97*d1c5dc47SRobert Mustacchi 98*d1c5dc47SRobert Mustacchi #endif /* !_STRICT_SYMBOLS | _STDC_C11 */ 99*d1c5dc47SRobert Mustacchi 100*d1c5dc47SRobert Mustacchi #ifdef __cplusplus 101*d1c5dc47SRobert Mustacchi } 102*d1c5dc47SRobert Mustacchi #endif 103*d1c5dc47SRobert Mustacchi 104*d1c5dc47SRobert Mustacchi #endif /* _THREADS_H */ 105