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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions