diff options
| author | Carson Fleming <[email protected]> | 2026-02-20 00:15:28 -0500 |
|---|---|---|
| committer | Carson Fleming <[email protected]> | 2026-02-20 00:15:28 -0500 |
| commit | 3aa9f72a8b84eb9e8149e0edfb744c9acea303ad (patch) | |
| tree | 6a386c927fc0c1a2a7639a99e44db215f32b282a /threads.h | |
| parent | 9ef0abf7ab5266f6b58c0e55bbe9dd9038bc7f6e (diff) | |
| download | safec-3aa9f72a8b84eb9e8149e0edfb744c9acea303ad.tar.gz | |
threads libary
Diffstat (limited to 'threads.h')
| -rw-r--r-- | threads.h | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/threads.h b/threads.h new file mode 100644 index 0000000..a0b6952 --- /dev/null +++ b/threads.h @@ -0,0 +1,68 @@ +#ifndef __SAFEC_THREADS_H +#define __SAFEC_THREADS_H +#include "types.h" +#include <time.h> + +#ifdef __STDC_NO_THREADS__ + +#include <pthread.h> + +typedef pthread_t thrd_t; +typedef pthread_mutex_t mtx_t; +typedef pthread_cond_t cnd_t; +typedef void* thrd_ret_type; +typedef thrd_ret_type (*thrd_start_t)(void*); + +#define thrd_success 0 +#define thrd_timedout ETIMEDOUT +#define mtx_plain NULL + +#define mtx_lock(m) pthread_mutex_lock(m) +#define mtx_timedlock(m, t) pthread_mutex_timedlock(m, t) +#define mtx_trylock(m) pthread_mutex_trylock(m) +#define mtx_unlock(m) pthread_mutex_unlock(m) +#define mtx_init(m, t) pthread_mutex_init(m, t) +#define mtx_destroy(m) pthread_mutex_destroy(m) + +#define cnd_init(c) pthread_cond_init(c, NULL) +#define cnd_signal(c) pthread_cond_signal(c) +#define cnd_broadcast(c) pthread_cond_broadcast(c) +#define cnd_wait(c, m) pthread_cond_wait(c, m) +#define cnd_timedwait(c, m, t) pthread_cond_timedwait(c, m, t) +#define cnd_destroy(c) pthread_cond_destroy(c) + +#define thrd_create(t, w, a) pthread_create(t, NULL, w, a) +#define thrd_equal(t1, t2) pthread_equal(t1, t2) +#define thrd_current() pthread_self() +#define thrd_yield() pthread_yield() +#define thrd_exit(rv) pthread_exit(rv) +#define thrd_detach(t) pthread_detach(t) +#define thrd_join(t, rv) pthread_join(t, rv) + +#else + +#include <threads.h> +typedef int thrd_ret_type; + +#endif + +typedef struct { + mtx_t __lock; + cnd_t __cond; + ssize_t __val; +} sema_t; + +/* these return thrd_success on success and something else on failure */ +int sema_init(sema_t* sema, ssize_t value); +int sema_get_value(sema_t* sema, ssize_t* p_value); +int sema_up(sema_t* sema); +int sema_up_many(sema_t* sema, ssize_t n); +int sema_down(sema_t* sema); +int sema_try_down(sema_t* sema); +int sema_down_timed(sema_t* sema, const struct timespec* time); +int sema_down_many(sema_t* sema, ssize_t n); +int sema_try_down_many(sema_t* sema, ssize_t n); +int sema_down_many_timed(sema_t* sema, const struct timespec* time, ssize_t n); +void sema_destroy(sema_t* sema); + +#endif |
