#ifndef _THREADS_H #define _THREADS_H /* This one is explicitly allowed to be included. */ #include #ifdef __cplusplus extern "C" { #endif /* These may or may not be implemented to be the same as some POSIX * types. Don't rely on any assumption about that, in particular if * you happen to use both interfaces in the same code. */ #define __NEED_cnd_t #define __NEED_mtx_t #define __NEED_once_flag #define __NEED_thrd_t #define __NEED_tss_t #include typedef int (*thrd_start_t)(void*); typedef void (*tss_dtor_t)(void*); /* This should be a keyword for C++11 */ #ifndef __cplusplus # define thread_local _Thread_local #endif /* The following list of 10 integer constants makes up for the binary compatibility of this C thread implementation. You must never link code against versions of the C library that do not agree upon these ABI parameters. Additionally this implementation assumes that the 5 types have the same size across C libraries and that these types can be initialized by the default initializer. The values for the 10 parameters are those that we proposed to glibc, in the hope that they will agree. */ #define TSS_DTOR_ITERATIONS 4 enum { thrd_success = 0, thrd_busy = 1, thrd_error = 2, thrd_nomem = 3, thrd_timedout = 4, }; enum { mtx_plain = 0, mtx_recursive = 1, // all mutexes are timed, here. so this is a no-op mtx_timed = 2, }; #define ONCE_FLAG_INIT { 0 } #ifdef __cplusplus extern "C" { #endif int thrd_create(thrd_t *, thrd_start_t, void *); _Noreturn void thrd_exit(int); int thrd_detach(thrd_t); int thrd_join(thrd_t, int *); int thrd_sleep(const struct timespec *, struct timespec *); void thrd_yield(void); thrd_t thrd_current(void); int thrd_equal(thrd_t, thrd_t); #define thrd_equal(A, B) ((A) == (B)) void call_once(once_flag *, void (*)(void)); int mtx_init(mtx_t *, int); void mtx_destroy(mtx_t *); int mtx_lock(mtx_t *); int mtx_timedlock(mtx_t *restrict, const struct timespec *restrict); int mtx_trylock(mtx_t *); int mtx_unlock(mtx_t *); int cnd_init(cnd_t *); void cnd_destroy(cnd_t *); int cnd_broadcast(cnd_t *); int cnd_signal(cnd_t *); int cnd_timedwait(cnd_t *restrict, mtx_t *restrict, const struct timespec *restrict); int cnd_wait(cnd_t *, mtx_t *); int tss_create(tss_t *, tss_dtor_t); void tss_delete(tss_t key); int tss_set(tss_t, void *); void *tss_get(tss_t); #ifdef __cplusplus } #endif #endif