-
Couldn't load subscription status.
- Fork 205
Open
Description
quick-c-atomic.h
#if (defined(__GNUC__) || defined(__GNUG__)) && !defined(__clang__)
// Use GCC builtins for version < 4.9
#if ((__GNUC__ << 16) + __GNUC_MINOR__ < ((4) << 16) + 9)
#define GCC_BUILTIN_ATOMICS
#endif
#endif
#ifdef GCC_BUILTIN_ATOMICS
#define atomic_fetch_add(obj, arg) __atomic_fetch_add(obj, arg, __ATOMIC_SEQ_CST)
#define atomic_compare_exchange_strong(obj, expected, desired) \
__atomic_compare_exchange_n(obj, expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
#define atomic_exchange(obj, desired) __atomic_exchange_n(obj, desired, __ATOMIC_SEQ_CST)
#define atomic_load(obj) __atomic_load_n(obj, __ATOMIC_SEQ_CST)
#define atomic_store(obj, desired) __atomic_store_n(obj, desired, __ATOMIC_SEQ_CST)
#define atomic_fetch_or(obj, arg) __atomic_fetch_or(obj, arg, __ATOMIC_SEQ_CST)
#define atomic_fetch_xor(obj, arg) __atomic_fetch_xor(obj, arg, __ATOMIC_SEQ_CST)
#define atomic_fetch_and(obj, arg) __atomic_fetch_and(obj, arg, __ATOMIC_SEQ_CST)
#define atomic_fetch_sub(obj, arg) __atomic_fetch_sub(obj, arg, __ATOMIC_SEQ_CST)
#define _Atomic
#else
**#if defined(_MSC_VER) && _MSC_VER < 1920 // VS2019 => 1920+
#include <Windows.h>
typedef LONG atomic_int;
#define atomic_fetch_add(obj, arg) InterlockedExchangeAdd((volatile LONG *)(obj), (arg))
#define atomic_fetch_sub(obj, arg) InterlockedExchangeAdd((volatile LONG *)(obj), -(arg))
#define atomic_load(obj) InterlockedCompareExchange((volatile LONG *)(obj), 0, 0)
#define atomic_store(obj, val) InterlockedExchange((volatile LONG *)(obj), (val))
#define atomic_exchange(obj, val) InterlockedExchange((volatile LONG *)(obj), (val))
#define atomic_compare_exchange_strong(obj, expected, desired) \
(InterlockedCompareExchange((volatile LONG *)(obj), (desired), *(expected)) == *(expected) \
? 1 \
: (*(expected) = \
InterlockedCompareExchange((volatile LONG *)(obj), (desired), *(expected)), \
0))
#define atomic_fetch_or(obj, arg) InterlockedOr((volatile LONG *)(obj), (arg))
#define atomic_fetch_and(obj, arg) InterlockedAnd((volatile LONG *)(obj), (arg))
#define atomic_fetch_xor(obj, arg) InterlockedXor((volatile LONG *)(obj), (arg))
#define _Atomic
#else
#include <stdatomic.h>
#endif**
#endif
Metadata
Metadata
Assignees
Labels
No labels