Skip to content

VS2017 atomic support #1183

@iclosure

Description

@iclosure

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions