summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-10-04 12:30:41 -0400
committerAndrew Opalach <andrew@akon.city> 2024-10-04 12:30:41 -0400
commit71dbdb7241fcae5ae91524669ede2d549bdb0ee6 (patch)
tree6a23b45c56dbd73218c278962a0dc46595304715 /include
parent395d423e6a6fda56e02d9551cadc93d229fe71c5 (diff)
downloadlibalabaster-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')
-rw-r--r--include/al/atomic.h78
-rw-r--r--include/al/random.h17
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