diff options
author | Charadon <dev@iotib.net> | 2022-06-08 00:32:31 -0400 |
---|---|---|
committer | Charadon <dev@iotib.net> | 2022-06-08 00:32:31 -0400 |
commit | 0855555e38a3ff6c702cd69cb760f2f2bb0912dd (patch) | |
tree | 904a9704347b056e9af70b4365f7a4f476c5641a /src/windows/threads.h | |
parent | 73f8ca5389c3d2d777e1dc5d25cbb61501a07691 (diff) | |
download | Pong-C-0855555e38a3ff6c702cd69cb760f2f2bb0912dd.tar.gz |
More efforts
Diffstat (limited to 'src/windows/threads.h')
-rw-r--r-- | src/windows/threads.h | 274 |
1 files changed, 0 insertions, 274 deletions
diff --git a/src/windows/threads.h b/src/windows/threads.h deleted file mode 100644 index 7be02e5..0000000 --- a/src/windows/threads.h +++ /dev/null @@ -1,274 +0,0 @@ -/* -Author: John Tsiombikas <nuclear@member.fsf.org> - -I place this piece of code in the public domain. Feel free to use as you see -fit. I'd appreciate it if you keep my name at the top of the code somehwere, -but whatever. - -Main project site: https://github.com/jtsiomb/c11threads -*/ - -#ifndef C11THREADS_H_ -#define C11THREADS_H_ - -#include <time.h> -#include <errno.h> -#include <pthread.h> -#include <sched.h> /* for sched_yield */ -#include <sys/time.h> - -#define thread_local _Thread_local -#define ONCE_FLAG_INIT PTHREAD_ONCE_INIT - -#ifdef __APPLE__ -/* Darwin doesn't implement timed mutexes currently */ -#define C11THREADS_NO_TIMED_MUTEX -#endif - -#ifdef C11THREADS_NO_TIMED_MUTEX -#define PTHREAD_MUTEX_TIMED_NP PTHREAD_MUTEX_NORMAL -#define C11THREADS_TIMEDLOCK_POLL_INTERVAL 5000000 /* 5 ms */ -#endif - -/* types */ -typedef pthread_t thrd_t; -typedef pthread_mutex_t mtx_t; -typedef pthread_cond_t cnd_t; -typedef pthread_key_t tss_t; -typedef pthread_once_t once_flag; - -typedef int (*thrd_start_t)(void*); -typedef void (*tss_dtor_t)(void*); - -enum { - mtx_plain = 0, - mtx_recursive = 1, - mtx_timed = 2, -}; - -enum { - thrd_success, - thrd_timedout, - thrd_busy, - thrd_error, - thrd_nomem -}; - - -/* ---- thread management ---- */ - -static inline int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) -{ - int res = pthread_create(thr, 0, (void*(*)(void*))func, arg); - if(res == 0) { - return thrd_success; - } - return res == ENOMEM ? thrd_nomem : thrd_error; -} - -static inline void thrd_exit(int res) -{ - pthread_exit((void*)(long)res); -} - -static inline int thrd_join(thrd_t thr, int *res) -{ - void *retval; - - if(pthread_join(thr, &retval) != 0) { - return thrd_error; - } - if(res) { - *res = (int)(long)retval; - } - return thrd_success; -} - -static inline int thrd_detach(thrd_t thr) -{ - return pthread_detach(thr) == 0 ? thrd_success : thrd_error; -} - -static inline thrd_t thrd_current(void) -{ - return pthread_self(); -} - -static inline int thrd_equal(thrd_t a, thrd_t b) -{ - return pthread_equal(a, b); -} - -static inline int thrd_sleep(const struct timespec *ts_in, struct timespec *rem_out) -{ - if(nanosleep(ts_in, rem_out) < 0) { - if(errno == EINTR) return -1; - return -2; - } - return 0; -} - -static inline void thrd_yield(void) -{ - sched_yield(); -} - -/* ---- mutexes ---- */ - -static inline int mtx_init(mtx_t *mtx, int type) -{ - int res; - pthread_mutexattr_t attr; - - pthread_mutexattr_init(&attr); - - if(type & mtx_timed) { - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_TIMED_NP); - } - if(type & mtx_recursive) { - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - } - - res = pthread_mutex_init(mtx, &attr) == 0 ? thrd_success : thrd_error; - pthread_mutexattr_destroy(&attr); - return res; -} - -static inline void mtx_destroy(mtx_t *mtx) -{ - pthread_mutex_destroy(mtx); -} - -static inline int mtx_lock(mtx_t *mtx) -{ - int res = pthread_mutex_lock(mtx); - if(res == EDEADLK) { - return thrd_busy; - } - return res == 0 ? thrd_success : thrd_error; -} - -static inline int mtx_trylock(mtx_t *mtx) -{ - int res = pthread_mutex_trylock(mtx); - if(res == EBUSY) { - return thrd_busy; - } - return res == 0 ? thrd_success : thrd_error; -} - -static inline int mtx_timedlock(mtx_t *mtx, const struct timespec *ts) -{ - int res; -#ifdef C11THREADS_NO_TIMED_MUTEX - /* fake a timedlock by polling trylock in a loop and waiting for a bit */ - struct timeval now; - struct timespec sleeptime; - - sleeptime.tv_sec = 0; - sleeptime.tv_nsec = C11THREADS_TIMEDLOCK_POLL_INTERVAL; - - while((res = pthread_mutex_trylock(mtx)) == EBUSY) { - gettimeofday(&now, NULL); - - if(now.tv_sec > ts->tv_sec || (now.tv_sec == ts->tv_sec && - (now.tv_usec * 1000) >= ts->tv_nsec)) { - return thrd_timedout; - } - - nanosleep(&sleeptime, NULL); - } -#else - if((res = pthread_mutex_timedlock(mtx, ts)) == ETIMEDOUT) { - return thrd_timedout; - } -#endif - return res == 0 ? thrd_success : thrd_error; -} - -static inline int mtx_unlock(mtx_t *mtx) -{ - return pthread_mutex_unlock(mtx) == 0 ? thrd_success : thrd_error; -} - -/* ---- condition variables ---- */ - -static inline int cnd_init(cnd_t *cond) -{ - return pthread_cond_init(cond, 0) == 0 ? thrd_success : thrd_error; -} - -static inline void cnd_destroy(cnd_t *cond) -{ - pthread_cond_destroy(cond); -} - -static inline int cnd_signal(cnd_t *cond) -{ - return pthread_cond_signal(cond) == 0 ? thrd_success : thrd_error; -} - -static inline int cnd_broadcast(cnd_t *cond) -{ - return pthread_cond_broadcast(cond) == 0 ? thrd_success : thrd_error; -} - -static inline int cnd_wait(cnd_t *cond, mtx_t *mtx) -{ - return pthread_cond_wait(cond, mtx) == 0 ? thrd_success : thrd_error; -} - -static inline int cnd_timedwait(cnd_t *cond, mtx_t *mtx, const struct timespec *ts) -{ - int res; - - if((res = pthread_cond_timedwait(cond, mtx, ts)) != 0) { - return res == ETIMEDOUT ? thrd_timedout : thrd_error; - } - return thrd_success; -} - -/* ---- thread-specific data ---- */ - -static inline int tss_create(tss_t *key, tss_dtor_t dtor) -{ - return pthread_key_create(key, dtor) == 0 ? thrd_success : thrd_error; -} - -static inline void tss_delete(tss_t key) -{ - pthread_key_delete(key); -} - -static inline int tss_set(tss_t key, void *val) -{ - return pthread_setspecific(key, val) == 0 ? thrd_success : thrd_error; -} - -static inline void *tss_get(tss_t key) -{ - return pthread_getspecific(key); -} - -/* ---- misc ---- */ - -static inline void call_once(once_flag *flag, void (*func)(void)) -{ - pthread_once(flag, func); -} - -#if __STDC_VERSION__ < 201112L || defined(C11THREADS_NO_TIMED_MUTEX) -/* TODO take base into account */ -static inline int timespec_get(struct timespec *ts, int base) -{ - struct timeval tv; - - gettimeofday(&tv, 0); - - ts->tv_sec = tv.tv_sec; - ts->tv_nsec = tv.tv_usec * 1000; - return base; -} -#endif /* not C11 */ - -#endif /* C11THREADS_H_ */ |