12#ifndef XTC_OS_THREAD_H
13#define XTC_OS_THREAD_H
26# define XTC_THREAD_LOCAL __declspec(thread)
27#elif defined(__GNUC__) || defined(__clang__)
28# define XTC_THREAD_LOCAL __thread
30# define XTC_THREAD_LOCAL _Thread_local
52struct __os_mutex { _Alignas(
long long)
unsigned char storage[64]; };
53struct __os_rwlock { _Alignas(
long long)
unsigned char storage[256]; };
54struct __os_cond { _Alignas(
long long)
unsigned char storage[64]; };
55struct __os_sem { _Alignas(
long long)
unsigned char storage[64]; };
68#define XTC_OS_MUTEX_INIT { { 0 } }
69#define XTC_OS_RWLOCK_INIT { { 0 } }
76typedef unsigned long __os_tls_key_t;
78typedef void *(*__os_thread_fn)(
void *);
79typedef void (*__os_tls_dtor)(
void *);
91typedef void *__os_once_t;
92#define XTC_OS_ONCE_INIT NULL
95typedef pthread_once_t __os_once_t;
96#define XTC_OS_ONCE_INIT PTHREAD_ONCE_INIT
111int __os_thread_create(__os_thread_t *thr, __os_thread_fn fn,
void *arg);
119int __os_pthread_create_masked(pthread_t *out,
void *(*fn)(
void *),
121int __os_thread_join(__os_thread_t *thr,
void **retval);
122int __os_thread_detach(__os_thread_t *thr);
123int __os_thread_self(__os_thread_t *out);
124void __os_thread_yield(
void);
125int __os_thread_setname(
const char *name);
126void __os_thread_apply_default_qos(
void);
127int __os_thread_set_affinity(
int cpu);
137int __os_tls_create(__os_tls_key_t *key, __os_tls_dtor dtor);
138int __os_tls_destroy(__os_tls_key_t key);
139int __os_tls_set(__os_tls_key_t key,
void *value);
140void *__os_tls_get(__os_tls_key_t key);
155int __os_thread_atexit(
void (*fn)(
void *),
void *arg);
162int __os_call_once(__os_once_t *once,
void (*fn)(
void));
173int __os_mutex_init(__os_mutex_t *m);
174int __os_mutex_destroy(__os_mutex_t *m);
175int __os_mutex_lock(__os_mutex_t *m);
176int __os_mutex_trylock(__os_mutex_t *m);
177int __os_mutex_unlock(__os_mutex_t *m);
196int __os_rwlock_init(__os_rwlock_t *r);
197int __os_rwlock_destroy(__os_rwlock_t *r);
198int __os_rwlock_rdlock(__os_rwlock_t *r);
199int __os_rwlock_wrlock(__os_rwlock_t *r);
200int __os_rwlock_rdunlock(__os_rwlock_t *r);
201int __os_rwlock_wrunlock(__os_rwlock_t *r);
212int __os_cond_init(__os_cond_t *c);
213int __os_cond_destroy(__os_cond_t *c);
214int __os_cond_wait(__os_cond_t *c, __os_mutex_t *m);
215int __os_cond_signal(__os_cond_t *c);
216int __os_cond_broadcast(__os_cond_t *c);
227int __os_sem_init(__os_sem_t *s,
unsigned initial);
228int __os_sem_destroy(__os_sem_t *s);
229int __os_sem_post(__os_sem_t *s);
230int __os_sem_wait(__os_sem_t *s);
231int __os_sem_trywait(__os_sem_t *s);