summaryrefslogtreecommitdiff
path: root/source/kit/atomic.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/kit/atomic.h')
-rw-r--r--source/kit/atomic.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/source/kit/atomic.h b/source/kit/atomic.h
new file mode 100644
index 0000000..b9242c2
--- /dev/null
+++ b/source/kit/atomic.h
@@ -0,0 +1,59 @@
+#ifndef KIT_ATOMIC_H
+#define KIT_ATOMIC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#ifndef _MSC_VER
+# include <stdatomic.h>
+
+# define KIT_ATOMIC(type_) _Atomic type_
+#else
+enum {
+ memory_order_relaxed,
+ memory_order_consume,
+ memory_order_acquire,
+ memory_order_release,
+ memory_order_acq_rel,
+ memory_order_seq_cst
+};
+# ifdef _WIN64
+# define KIT_ATOMIC_VAR uint64_t
+# else
+# define KIT_ATOMIC_VAR volatile uint32_t
+# endif
+# define KIT_ATOMIC(type_) volatile KIT_ATOMIC_VAR
+
+void kit_atomic_store_explicit(volatile KIT_ATOMIC_VAR *var,
+ KIT_ATOMIC_VAR value,
+ int memory_order);
+
+KIT_ATOMIC_VAR kit_atomic_load_explicit(volatile KIT_ATOMIC_VAR *var,
+ int memory_order);
+
+KIT_ATOMIC_VAR kit_atomic_fetch_add_explicit(
+ volatile KIT_ATOMIC_VAR *var, KIT_ATOMIC_VAR value,
+ int memory_order);
+
+KIT_ATOMIC_VAR kit_atomic_exchange_explicit(
+ volatile KIT_ATOMIC_VAR *var, KIT_ATOMIC_VAR value,
+ int memory_order);
+
+# define atomic_store_explicit kit_atomic_store_explicit
+# define atomic_load_explicit kit_atomic_load_explicit
+# define atomic_fetch_add_explicit kit_atomic_fetch_add_explicit
+# define atomic_exchange_explicit kit_atomic_exchange_explicit
+#endif
+
+#ifndef KIT_DISABLE_SHORT_NAMES
+# define ATOMIC KIT_ATOMIC
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif