116 lines
4.9 KiB
C
116 lines
4.9 KiB
C
#ifndef VESSEL_THREAD_H_
|
|
#define VESSEL_THREAD_H_
|
|
|
|
#include "conf.h"
|
|
|
|
#include "def.h"
|
|
|
|
#include <pthread.h>
|
|
|
|
typedef struct {
|
|
pthread_t _thread;
|
|
} vs_Thread;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t _lock;
|
|
bool _enabled;
|
|
} vs_Lock;
|
|
|
|
#define VS_ATOM_TYPE(name, type) \
|
|
typedef struct { \
|
|
volatile type _value; \
|
|
} vs_Atom##name;
|
|
|
|
#define VS_ATOM_INIT_VAR(value) { ._value = (value) }
|
|
|
|
#if defined(VS_THREAD_ATOMIC) || defined(__clang__) || \
|
|
(defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)))
|
|
|
|
# define VS_ATOM_LOAD(var) __atomic_load_n(&(var)->_value, __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_STORE(var, value) __atomic_store_n(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
|
|
# define VS_ATOM_FETCH_AND_ADD(var, value) \
|
|
__atomic_fetch_add(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_FETCH_AND_SUB(var, value) \
|
|
__atomic_fetch_sub(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_FETCH_AND_OR(var, value) \
|
|
__atomic_fetch_or(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_FETCH_AND_AND(var, value) \
|
|
__atomic_fetch_and(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_FETCH_AND_XOR(var, value) \
|
|
__atomic_fetch_xor(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_FETCH_AND_NAND(var, value) \
|
|
__atomic_fetch_nand(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
|
|
# define VS_ATOM_ADD_AND_FETCH(var, value) \
|
|
__atomic_add_fetch(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_SUB_AND_FETCH(var, value) \
|
|
__atomic_sub_fetch(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_OR_AND_FETCH(var, value) \
|
|
__atomic_or_fetch(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_AND_AND_FETCH(var, value) \
|
|
__atomic_and_fetch(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_XOR_AND_FETCH(var, value) \
|
|
__atomic_xor_fetch(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_NAND_AND_FETCH(var, value) \
|
|
__atomic_nand_fetch(&(var)->_value, (value), __ATOMIC_SEQ_CST)
|
|
|
|
# define VS_ATOM_BOOL_COMPARE_AND_SWAP(var, expected, desired) \
|
|
__atomic_compare_exchange_n( \
|
|
&(var)->_value, &(expected), (desired), 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
|
|
# define VS_ATOM_VAL_COMPARE_AND_SWAP(var, expected, desired) \
|
|
__atomic_compare_exchange_n( \
|
|
&(var)->_value, &(expected), (desired), 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
|
|
|
|
#else
|
|
|
|
# define VS_ATOM_LOAD(var) __sync_fetch_and_add(&(var)->_value, 0)
|
|
# define VS_ATOM_STORE(var, value) __sync_lock_test_and_set(&(var)->_value, (value))
|
|
|
|
# define VS_ATOM_FETCH_AND_ADD(var, value) __sync_fetch_and_add(&(var)->_value, (value))
|
|
# define VS_ATOM_FETCH_AND_SUB(var, value) __sync_fetch_and_sub(&(var)->_value, (value))
|
|
# define VS_ATOM_FETCH_AND_OR(var, value) __sync_fetch_and_or(&(var)->_value, (value))
|
|
# define VS_ATOM_FETCH_AND_AND(var, value) __sync_fetch_and_and(&(var)->_value, (value))
|
|
# define VS_ATOM_FETCH_AND_XOR(var, value) __sync_fetch_and_xor(&(var)->_value, (value))
|
|
# define VS_ATOM_FETCH_AND_NAND(var, value) __sync_fetch_and_nand(&(var)->_value, (value))
|
|
|
|
# define VS_ATOM_ADD_AND_FETCH(var, value) __sync_add_and_fetch(&(var)->_value, (value))
|
|
# define VS_ATOM_SUB_AND_FETCH(var, value) __sync_sub_and_fetch(&(var)->_value, (value))
|
|
# define VS_ATOM_OR_AND_FETCH(var, value) __sync_or_and_fetch(&(var)->_value, (value))
|
|
# define VS_ATOM_AND_AND_FETCH(var, value) __sync_and_and_fetch(&(var)->_value, (value))
|
|
# define VS_ATOM_XOR_AND_FETCH(var, value) __sync_xor_and_fetch(&(var)->_value, (value))
|
|
# define VS_ATOM_NAND_AND_FETCH(var, value) __sync_nand_and_fetch(&(var)->_value, (value))
|
|
|
|
# define VS_ATOM_BOOL_COMPARE_AND_SWAP(var, expected, desired) \
|
|
__sync_bool_compare_and_swap(&(var)->_value, (expected), (desired))
|
|
# define VS_ATOM_VAL_COMPARE_AND_SWAP(var, expected, desired) \
|
|
__sync_val_compare_and_swap(&(var)->_value, (expected), (desired))
|
|
|
|
#endif /* VS_THREAD_ATOMIC & compiler plugins */
|
|
|
|
bool vs_Thread_init(vs_Thread *thread, void *(*target)(void *), void *arg);
|
|
bool vs_Thread_detach(vs_Thread *thread);
|
|
bool vs_Thread_attach(vs_Thread *thread, void **retval);
|
|
bool vs_Thread_destroy(vs_Thread *thread);
|
|
|
|
bool vs_Lock_disable(vs_Lock *lock);
|
|
bool vs_Lock_enable(vs_Lock *lock);
|
|
bool vs_Lock_init(vs_Lock *lock);
|
|
bool vs_Lock_lock(vs_Lock *lock);
|
|
bool vs_Lock_unlock(vs_Lock *lock);
|
|
bool vs_Lock_destroy(vs_Lock *lock);
|
|
|
|
VS_ATOM_TYPE(U8, uint8_t)
|
|
VS_ATOM_TYPE(U16, uint16_t)
|
|
VS_ATOM_TYPE(U32, uint32_t)
|
|
VS_ATOM_TYPE(U64, uint64_t)
|
|
|
|
VS_ATOM_TYPE(I8, int8_t)
|
|
VS_ATOM_TYPE(I16, int16_t)
|
|
VS_ATOM_TYPE(I32, int32_t)
|
|
VS_ATOM_TYPE(I64, int64_t)
|
|
|
|
VS_ATOM_TYPE(Bool, bool)
|
|
VS_ATOM_TYPE(Ptr, void *)
|
|
|
|
#endif /* VESSEL_THREAD_H_ */
|