1*cda5da8dSAndroid Build Coastguard Worker #ifndef _THREADS_H 2*cda5da8dSAndroid Build Coastguard Worker #define _THREADS_H 3*cda5da8dSAndroid Build Coastguard Worker 4*cda5da8dSAndroid Build Coastguard Worker #include <features.h> 5*cda5da8dSAndroid Build Coastguard Worker #include <time.h> 6*cda5da8dSAndroid Build Coastguard Worker 7*cda5da8dSAndroid Build Coastguard Worker #ifdef __cplusplus 8*cda5da8dSAndroid Build Coastguard Worker extern "C" { 9*cda5da8dSAndroid Build Coastguard Worker typedef unsigned long thrd_t; 10*cda5da8dSAndroid Build Coastguard Worker #else 11*cda5da8dSAndroid Build Coastguard Worker typedef struct __pthread *thrd_t; 12*cda5da8dSAndroid Build Coastguard Worker #define thread_local _Thread_local 13*cda5da8dSAndroid Build Coastguard Worker #endif 14*cda5da8dSAndroid Build Coastguard Worker 15*cda5da8dSAndroid Build Coastguard Worker typedef int once_flag; 16*cda5da8dSAndroid Build Coastguard Worker typedef unsigned tss_t; 17*cda5da8dSAndroid Build Coastguard Worker typedef int (*thrd_start_t)(void *); 18*cda5da8dSAndroid Build Coastguard Worker typedef void (*tss_dtor_t)(void *); 19*cda5da8dSAndroid Build Coastguard Worker 20*cda5da8dSAndroid Build Coastguard Worker #define __NEED_cnd_t 21*cda5da8dSAndroid Build Coastguard Worker #define __NEED_mtx_t 22*cda5da8dSAndroid Build Coastguard Worker 23*cda5da8dSAndroid Build Coastguard Worker #include <bits/alltypes.h> 24*cda5da8dSAndroid Build Coastguard Worker 25*cda5da8dSAndroid Build Coastguard Worker #define TSS_DTOR_ITERATIONS 4 26*cda5da8dSAndroid Build Coastguard Worker 27*cda5da8dSAndroid Build Coastguard Worker enum { 28*cda5da8dSAndroid Build Coastguard Worker thrd_success = 0, 29*cda5da8dSAndroid Build Coastguard Worker thrd_busy = 1, 30*cda5da8dSAndroid Build Coastguard Worker thrd_error = 2, 31*cda5da8dSAndroid Build Coastguard Worker thrd_nomem = 3, 32*cda5da8dSAndroid Build Coastguard Worker thrd_timedout = 4, 33*cda5da8dSAndroid Build Coastguard Worker }; 34*cda5da8dSAndroid Build Coastguard Worker 35*cda5da8dSAndroid Build Coastguard Worker enum { 36*cda5da8dSAndroid Build Coastguard Worker mtx_plain = 0, 37*cda5da8dSAndroid Build Coastguard Worker mtx_recursive = 1, 38*cda5da8dSAndroid Build Coastguard Worker mtx_timed = 2, 39*cda5da8dSAndroid Build Coastguard Worker }; 40*cda5da8dSAndroid Build Coastguard Worker 41*cda5da8dSAndroid Build Coastguard Worker #define ONCE_FLAG_INIT 0 42*cda5da8dSAndroid Build Coastguard Worker 43*cda5da8dSAndroid Build Coastguard Worker int thrd_create(thrd_t *, thrd_start_t, void *); 44*cda5da8dSAndroid Build Coastguard Worker _Noreturn void thrd_exit(int); 45*cda5da8dSAndroid Build Coastguard Worker 46*cda5da8dSAndroid Build Coastguard Worker int thrd_detach(thrd_t); 47*cda5da8dSAndroid Build Coastguard Worker int thrd_join(thrd_t, int *); 48*cda5da8dSAndroid Build Coastguard Worker 49*cda5da8dSAndroid Build Coastguard Worker int thrd_sleep(const struct timespec *, struct timespec *); 50*cda5da8dSAndroid Build Coastguard Worker void thrd_yield(void); 51*cda5da8dSAndroid Build Coastguard Worker 52*cda5da8dSAndroid Build Coastguard Worker thrd_t thrd_current(void); 53*cda5da8dSAndroid Build Coastguard Worker int thrd_equal(thrd_t, thrd_t); 54*cda5da8dSAndroid Build Coastguard Worker #ifndef __cplusplus 55*cda5da8dSAndroid Build Coastguard Worker #define thrd_equal(A, B) ((A) == (B)) 56*cda5da8dSAndroid Build Coastguard Worker #endif 57*cda5da8dSAndroid Build Coastguard Worker 58*cda5da8dSAndroid Build Coastguard Worker void call_once(once_flag *, void (*)(void)); 59*cda5da8dSAndroid Build Coastguard Worker 60*cda5da8dSAndroid Build Coastguard Worker int mtx_init(mtx_t *, int); 61*cda5da8dSAndroid Build Coastguard Worker void mtx_destroy(mtx_t *); 62*cda5da8dSAndroid Build Coastguard Worker 63*cda5da8dSAndroid Build Coastguard Worker int mtx_lock(mtx_t *); 64*cda5da8dSAndroid Build Coastguard Worker int mtx_timedlock(mtx_t *__restrict, const struct timespec *__restrict); 65*cda5da8dSAndroid Build Coastguard Worker int mtx_trylock(mtx_t *); 66*cda5da8dSAndroid Build Coastguard Worker int mtx_unlock(mtx_t *); 67*cda5da8dSAndroid Build Coastguard Worker 68*cda5da8dSAndroid Build Coastguard Worker int cnd_init(cnd_t *); 69*cda5da8dSAndroid Build Coastguard Worker void cnd_destroy(cnd_t *); 70*cda5da8dSAndroid Build Coastguard Worker 71*cda5da8dSAndroid Build Coastguard Worker int cnd_broadcast(cnd_t *); 72*cda5da8dSAndroid Build Coastguard Worker int cnd_signal(cnd_t *); 73*cda5da8dSAndroid Build Coastguard Worker 74*cda5da8dSAndroid Build Coastguard Worker int cnd_timedwait(cnd_t *__restrict, mtx_t *__restrict, const struct timespec *__restrict); 75*cda5da8dSAndroid Build Coastguard Worker int cnd_wait(cnd_t *, mtx_t *); 76*cda5da8dSAndroid Build Coastguard Worker 77*cda5da8dSAndroid Build Coastguard Worker int tss_create(tss_t *, tss_dtor_t); 78*cda5da8dSAndroid Build Coastguard Worker void tss_delete(tss_t); 79*cda5da8dSAndroid Build Coastguard Worker 80*cda5da8dSAndroid Build Coastguard Worker int tss_set(tss_t, void *); 81*cda5da8dSAndroid Build Coastguard Worker void *tss_get(tss_t); 82*cda5da8dSAndroid Build Coastguard Worker 83*cda5da8dSAndroid Build Coastguard Worker #if _REDIR_TIME64 84*cda5da8dSAndroid Build Coastguard Worker __REDIR(thrd_sleep, __thrd_sleep_time64); 85*cda5da8dSAndroid Build Coastguard Worker __REDIR(mtx_timedlock, __mtx_timedlock_time64); 86*cda5da8dSAndroid Build Coastguard Worker __REDIR(cnd_timedwait, __cnd_timedwait_time64); 87*cda5da8dSAndroid Build Coastguard Worker #endif 88*cda5da8dSAndroid Build Coastguard Worker 89*cda5da8dSAndroid Build Coastguard Worker #ifdef __cplusplus 90*cda5da8dSAndroid Build Coastguard Worker } 91*cda5da8dSAndroid Build Coastguard Worker #endif 92*cda5da8dSAndroid Build Coastguard Worker 93*cda5da8dSAndroid Build Coastguard Worker #endif 94