diff options
| author | 2024-10-04 12:30:41 -0400 | |
|---|---|---|
| committer | 2024-10-04 12:30:41 -0400 | |
| commit | 71dbdb7241fcae5ae91524669ede2d549bdb0ee6 (patch) | |
| tree | 6a23b45c56dbd73218c278962a0dc46595304715 /include/al | |
| parent | 395d423e6a6fda56e02d9551cadc93d229fe71c5 (diff) | |
| download | libalabaster-71dbdb7241fcae5ae91524669ede2d549bdb0ee6.tar.gz libalabaster-71dbdb7241fcae5ae91524669ede2d549bdb0ee6.tar.bz2 libalabaster-71dbdb7241fcae5ae91524669ede2d549bdb0ee6.zip | |
atomic: New syntax
al_atomic_ptr_load() -> al_atomic_load(void)()
al_atomic_u16_store() -> al_atomic_store(u16)()
...
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'include/al')
| -rw-r--r-- | include/al/atomic.h | 78 | ||||
| -rw-r--r-- | include/al/random.h | 17 |
2 files changed, 53 insertions, 42 deletions
diff --git a/include/al/atomic.h b/include/al/atomic.h index 1b733ad..7f8a087 100644 --- a/include/al/atomic.h +++ b/include/al/atomic.h @@ -12,44 +12,54 @@ #define AL_ATOMIC_ACQ_REL c89atomic_memory_order_acq_rel #define AL_ATOMIC_SEQ_CST c89atomic_memory_order_seq_cst -#define al_atomic_ptr_load(p, order) c89atomic_load_explicit_ptr(((volatile void **)p), order) -#define al_atomic_ptr_store(p, v, order) c89atomic_store_explicit_ptr(((volatile void **)p), (void *)v, order) +#define atomic(T) _al_atomic_##T -#define atomic_size_t c89atomic_uint64 -#define al_atomic_size_t_load(p, order) ((size_t)c89atomic_load_explicit_64(p, order)) -#define al_atomic_size_t_store(p, v, order) c89atomic_store_explicit_64(p, ((size_t)v), order) +#define al_atomic_load(T) _al_atomic_load_##T +#define al_atomic_store(T) _al_atomic_store_##T +#define al_atomic_add(T) _al_atomic_add_##T +#define al_atomic_sub(T) _al_atomic_sub_##T -#define atomic_s64 c89atomic_int64 -#define al_atomic_s64_load(p, order) ((s64)c89atomic_load_explicit_i64(p, order)) -#define al_atomic_s64_store(p, v, order) c89atomic_store_explicit_i64(p, ((s64)v), order) +// Special case for pointers. +#define _al_atomic_load_void(p, order) c89atomic_load_explicit_ptr(((volatile void **)p), order) +#define _al_atomic_store_void(p, v, order) c89atomic_store_explicit_ptr(((volatile void **)p), (void *)v, order) -#define atomic_u64 c89atomic_uint64 -#define al_atomic_u64_load(p, order) ((u64)c89atomic_load_explicit_64(p, order)) -#define al_atomic_u64_store(p, v, order) c89atomic_store_explicit_64(p, ((u64)v), order) -#define al_atomic_u64_add(p, v, order) c89atomic_fetch_add_explicit_64(p, ((u64)v), order) -#define al_atomic_u64_sub(p, v, order) c89atomic_fetch_sub_explicit_64(p, ((u64)v), order) +// c89atomic compat. +typedef f64 c89atomic_f64; +typedef f32 c89atomic_f32; -#define atomic_f64 f64 -#define al_atomic_f64_load(p, order) ((f64)c89atomic_load_explicit_f64(p, order)) -#define al_atomic_f64_store(p, v, order) c89atomic_store_explicit_f64(p, ((f64)v), order) +#define AL_ATOMIC_DEFINE(T, C, S) \ + typedef c89atomic_##C atomic(T); \ + static inline T al_atomic_load(T)(atomic(T) *a, int order) \ + { \ + return c89atomic_load_explicit_##S(a, order); \ + } \ + static inline void al_atomic_store(T)(atomic(T) *a, T value, int order) \ + { \ + c89atomic_store_explicit_##S(a, value, order); \ + } \ + static inline T al_atomic_add(T)(atomic(T) *a, T value, int order) \ + { \ + return c89atomic_fetch_add_explicit_##S(a, value, order); \ + } \ + static inline T al_atomic_sub(T)(atomic(T) *a, T value, int order) \ + { \ + return c89atomic_fetch_sub_explicit_##S(a, value, order); \ + } -#define atomic_s32 c89atomic_int32 -#define al_atomic_s32_load(p, order) ((s32)c89atomic_load_explicit_i32(p, order)) -#define al_atomic_s32_store(p, v, order) c89atomic_store_explicit_i32(p, ((s32)v), order) -#define al_atomic_s32_add(p, v, order) c89atomic_fetch_add_explicit_i32(p, ((s32)v), order) -#define al_atomic_s32_sub(p, v, order) c89atomic_fetch_sub_explicit_i32(p, ((s32)v), order) - -#define atomic_u16 c89atomic_uint16 -#define al_atomic_u16_load(p, order) c89atomic_load_explicit_16(p, order) -#define al_atomic_u16_store(p, v, order) c89atomic_store_explicit_16(p, ((u16)v), order) -#define al_atomic_u16_add(p, v, order) c89atomic_fetch_add_explicit_16(p, ((u16)v), order) - -#define atomic_u8 c89atomic_uint8 -#define al_atomic_u8_load(p, order) c89atomic_load_explicit_8(p, order) -#define al_atomic_u8_store(p, v, order) c89atomic_store_explicit_8(p, ((u8)v), order) - -#define atomic_bool c89atomic_uint8 -#define al_atomic_bool_load(p, order) c89atomic_load_explicit_8(p, order) -#define al_atomic_bool_store(p, v, order) c89atomic_store_explicit_8(p, ((bool)v), order) +#if defined C89ATOMIC_64BIT +AL_ATOMIC_DEFINE(size_t, uint64, 64) +#elif defined C89ATOMIC_32BIT +AL_ATOMIC_DEFINE(size_t, uint32, 32) +#endif +AL_ATOMIC_DEFINE(u64, uint64, 64); +AL_ATOMIC_DEFINE(s64, int64, i64); +AL_ATOMIC_DEFINE(u32, uint32, 32); +AL_ATOMIC_DEFINE(s32, int32, i32); +AL_ATOMIC_DEFINE(u16, uint16, 16); +AL_ATOMIC_DEFINE(s16, int16, i16); +AL_ATOMIC_DEFINE(u8, uint8, 8); +AL_ATOMIC_DEFINE(s8, int8, i8); +AL_ATOMIC_DEFINE(f64, f64, f64); +AL_ATOMIC_DEFINE(f32, f32, f32); #endif // _AL_ATOMIC_H diff --git a/include/al/random.h b/include/al/random.h index 40c8654..9d27c18 100644 --- a/include/al/random.h +++ b/include/al/random.h @@ -18,17 +18,18 @@ static s32 al_rand(void) return rand(); } -static atomic_u16 _al_rand_value = 1; +// Each file that includes this header will have a separate counter. +static atomic(u16) _al_inc_value = 1; -// Temporary, can guarantee no collisions for the current use case. This functions per-file, -// so each file this is included in will have a seperate counter. -static u16 al_rand_u16(void) +// This is apart of random because currently al_inc_u16() is used as a substitute +// for proper random ID generation. +static u16 al_inc_u16(void) { - u16 ret = al_atomic_u16_add(&_al_rand_value, 1, AL_ATOMIC_RELAXED); - if (ret == UINT16_MAX) { - al_atomic_u16_store(&_al_rand_value, 1, AL_ATOMIC_RELAXED); + if (al_atomic_load(u16)(&_al_inc_value, AL_ATOMIC_ACQUIRE) == UINT16_MAX) { + al_atomic_store(u16)(&_al_inc_value, 1, AL_ATOMIC_RELEASE); + return 1; } - return ret; + return al_atomic_add(u16)(&_al_inc_value, 1, AL_ATOMIC_RELEASE); } AL_UNUSED_FUNCTION_POP |