mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-23 00:34:03 +02:00
Remove comments and empty lines from c89atomic integration.
This commit is contained in:
+12
-210
@@ -7604,11 +7604,9 @@ ma_atomic_increment/decrement_*() takes a pointer to the variable being incremen
|
|||||||
/* c89atomic.h begin */
|
/* c89atomic.h begin */
|
||||||
#ifndef c89atomic_h
|
#ifndef c89atomic_h
|
||||||
#define c89atomic_h
|
#define c89atomic_h
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef signed char c89atomic_int8;
|
typedef signed char c89atomic_int8;
|
||||||
typedef unsigned char c89atomic_uint8;
|
typedef unsigned char c89atomic_uint8;
|
||||||
typedef signed short c89atomic_int16;
|
typedef signed short c89atomic_int16;
|
||||||
@@ -7622,12 +7620,9 @@ typedef unsigned __int64 c89atomic_uint64;
|
|||||||
typedef unsigned long long c89atomic_int64;
|
typedef unsigned long long c89atomic_int64;
|
||||||
typedef unsigned long long c89atomic_uint64;
|
typedef unsigned long long c89atomic_uint64;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef int c89atomic_memory_order;
|
typedef int c89atomic_memory_order;
|
||||||
typedef unsigned char c89atomic_bool;
|
typedef unsigned char c89atomic_bool;
|
||||||
typedef unsigned char c89atomic_flag;
|
typedef unsigned char c89atomic_flag;
|
||||||
|
|
||||||
/* Architecture Detection */
|
|
||||||
#if !defined(C89ATOMIC_64BIT) && !defined(C89ATOMIC_32BIT)
|
#if !defined(C89ATOMIC_64BIT) && !defined(C89ATOMIC_32BIT)
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
@@ -7637,7 +7632,6 @@ typedef unsigned char c89atomic_flag;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(C89ATOMIC_64BIT) && !defined(C89ATOMIC_32BIT)
|
#if !defined(C89ATOMIC_64BIT) && !defined(C89ATOMIC_32BIT)
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#ifdef __LP64__
|
#ifdef __LP64__
|
||||||
@@ -7647,7 +7641,6 @@ typedef unsigned char c89atomic_flag;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(C89ATOMIC_64BIT) && !defined(C89ATOMIC_32BIT)
|
#if !defined(C89ATOMIC_64BIT) && !defined(C89ATOMIC_32BIT)
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#if INTPTR_MAX == INT64_MAX
|
#if INTPTR_MAX == INT64_MAX
|
||||||
@@ -7656,7 +7649,6 @@ typedef unsigned char c89atomic_flag;
|
|||||||
#define C89ATOMIC_32BIT
|
#define C89ATOMIC_32BIT
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(_M_X64)
|
#if defined(__x86_64__) || defined(_M_X64)
|
||||||
#define C89ATOMIC_X64
|
#define C89ATOMIC_X64
|
||||||
#elif defined(__i386) || defined(_M_IX86)
|
#elif defined(__i386) || defined(_M_IX86)
|
||||||
@@ -7664,17 +7656,9 @@ typedef unsigned char c89atomic_flag;
|
|||||||
#elif defined(__arm__) || defined(_M_ARM)
|
#elif defined(__arm__) || defined(_M_ARM)
|
||||||
#define C89ATOMIC_ARM
|
#define C89ATOMIC_ARM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define C89ATOMIC_INLINE __forceinline
|
#define C89ATOMIC_INLINE __forceinline
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
/*
|
|
||||||
I've had a bug report where GCC is emitting warnings about functions possibly not being inlineable. This warning happens when
|
|
||||||
the __attribute__((always_inline)) attribute is defined without an "inline" statement. I think therefore there must be some
|
|
||||||
case where "__inline__" is not always defined, thus the compiler emitting these warnings. When using -std=c89 or -ansi on the
|
|
||||||
command line, we cannot use the "inline" keyword and instead need to use "__inline__". In an attempt to work around this issue
|
|
||||||
I am using "__inline__" only when we're compiling in strict ANSI mode.
|
|
||||||
*/
|
|
||||||
#if defined(__STRICT_ANSI__)
|
#if defined(__STRICT_ANSI__)
|
||||||
#define C89ATOMIC_INLINE __inline__ __attribute__((always_inline))
|
#define C89ATOMIC_INLINE __inline__ __attribute__((always_inline))
|
||||||
#else
|
#else
|
||||||
@@ -7683,41 +7667,31 @@ typedef unsigned char c89atomic_flag;
|
|||||||
#else
|
#else
|
||||||
#define C89ATOMIC_INLINE
|
#define C89ATOMIC_INLINE
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(_MSC_VER)
|
||||||
#if defined(_MSC_VER) /*&& !defined(__clang__)*/
|
|
||||||
/* Visual C++. */
|
|
||||||
#define c89atomic_memory_order_relaxed 0
|
#define c89atomic_memory_order_relaxed 0
|
||||||
#define c89atomic_memory_order_consume 1
|
#define c89atomic_memory_order_consume 1
|
||||||
#define c89atomic_memory_order_acquire 2
|
#define c89atomic_memory_order_acquire 2
|
||||||
#define c89atomic_memory_order_release 3
|
#define c89atomic_memory_order_release 3
|
||||||
#define c89atomic_memory_order_acq_rel 4
|
#define c89atomic_memory_order_acq_rel 4
|
||||||
#define c89atomic_memory_order_seq_cst 5
|
#define c89atomic_memory_order_seq_cst 5
|
||||||
|
#if _MSC_VER >= 1400
|
||||||
/* Visual Studio 2003 and earlier have no support for sized atomic operations. We'll need to use inlined assembly for these compilers. */
|
|
||||||
#if _MSC_VER >= 1400 /* 1400 = Visual Studio 2005 */
|
|
||||||
/* New Visual C++. */
|
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
|
|
||||||
#define c89atomic_exchange_explicit_8( dst, src, order) (c89atomic_uint8 )_InterlockedExchange8 ((volatile char* )dst, (char )src)
|
#define c89atomic_exchange_explicit_8( dst, src, order) (c89atomic_uint8 )_InterlockedExchange8 ((volatile char* )dst, (char )src)
|
||||||
#define c89atomic_exchange_explicit_16(dst, src, order) (c89atomic_uint16)_InterlockedExchange16((volatile short*)dst, (short)src)
|
#define c89atomic_exchange_explicit_16(dst, src, order) (c89atomic_uint16)_InterlockedExchange16((volatile short*)dst, (short)src)
|
||||||
#define c89atomic_exchange_explicit_32(dst, src, order) (c89atomic_uint32)_InterlockedExchange ((volatile long* )dst, (long )src)
|
#define c89atomic_exchange_explicit_32(dst, src, order) (c89atomic_uint32)_InterlockedExchange ((volatile long* )dst, (long )src)
|
||||||
#if defined(C89ATOMIC_64BIT)
|
#if defined(C89ATOMIC_64BIT)
|
||||||
#define c89atomic_exchange_explicit_64(dst, src, order) (c89atomic_uint64)_InterlockedExchange64((volatile long long*)dst, (long long)src)
|
#define c89atomic_exchange_explicit_64(dst, src, order) (c89atomic_uint64)_InterlockedExchange64((volatile long long*)dst, (long long)src)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define c89atomic_fetch_add_explicit_8( dst, src, order) (c89atomic_uint8 )_InterlockedExchangeAdd8 ((volatile char* )dst, (char )src)
|
#define c89atomic_fetch_add_explicit_8( dst, src, order) (c89atomic_uint8 )_InterlockedExchangeAdd8 ((volatile char* )dst, (char )src)
|
||||||
#define c89atomic_fetch_add_explicit_16(dst, src, order) (c89atomic_uint16)_InterlockedExchangeAdd16((volatile short*)dst, (short)src)
|
#define c89atomic_fetch_add_explicit_16(dst, src, order) (c89atomic_uint16)_InterlockedExchangeAdd16((volatile short*)dst, (short)src)
|
||||||
#define c89atomic_fetch_add_explicit_32(dst, src, order) (c89atomic_uint32)_InterlockedExchangeAdd ((volatile long* )dst, (long )src)
|
#define c89atomic_fetch_add_explicit_32(dst, src, order) (c89atomic_uint32)_InterlockedExchangeAdd ((volatile long* )dst, (long )src)
|
||||||
#if defined(C89ATOMIC_64BIT)
|
#if defined(C89ATOMIC_64BIT)
|
||||||
#define c89atomic_fetch_add_explicit_64(dst, src, order) (c89atomic_uint64)_InterlockedExchangeAdd64((volatile long long*)dst, (long long)src)
|
#define c89atomic_fetch_add_explicit_64(dst, src, order) (c89atomic_uint64)_InterlockedExchangeAdd64((volatile long long*)dst, (long long)src)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define c89atomic_compare_and_swap_8( dst, expected, desired) (c89atomic_uint8 )_InterlockedCompareExchange8 ((volatile char* )dst, (char )desired, (char )expected)
|
#define c89atomic_compare_and_swap_8( dst, expected, desired) (c89atomic_uint8 )_InterlockedCompareExchange8 ((volatile char* )dst, (char )desired, (char )expected)
|
||||||
#define c89atomic_compare_and_swap_16(dst, expected, desired) (c89atomic_uint16)_InterlockedCompareExchange16((volatile short* )dst, (short )desired, (short )expected)
|
#define c89atomic_compare_and_swap_16(dst, expected, desired) (c89atomic_uint16)_InterlockedCompareExchange16((volatile short* )dst, (short )desired, (short )expected)
|
||||||
#define c89atomic_compare_and_swap_32(dst, expected, desired) (c89atomic_uint32)_InterlockedCompareExchange ((volatile long* )dst, (long )desired, (long )expected)
|
#define c89atomic_compare_and_swap_32(dst, expected, desired) (c89atomic_uint32)_InterlockedCompareExchange ((volatile long* )dst, (long )desired, (long )expected)
|
||||||
#define c89atomic_compare_and_swap_64(dst, expected, desired) (c89atomic_uint64)_InterlockedCompareExchange64((volatile long long*)dst, (long long)desired, (long long)expected)
|
#define c89atomic_compare_and_swap_64(dst, expected, desired) (c89atomic_uint64)_InterlockedCompareExchange64((volatile long long*)dst, (long long)desired, (long long)expected)
|
||||||
|
|
||||||
/* Can't use MemoryBarrier() for this as it require Windows headers which we want to avoid in the header. */
|
|
||||||
#if defined(C89ATOMIC_X64)
|
#if defined(C89ATOMIC_X64)
|
||||||
#define c89atomic_thread_fence(order) __faststorefence()
|
#define c89atomic_thread_fence(order) __faststorefence()
|
||||||
#else
|
#else
|
||||||
@@ -7727,13 +7701,9 @@ typedef unsigned char c89atomic_flag;
|
|||||||
(void)order;
|
(void)order;
|
||||||
c89atomic_fetch_add_explicit_32(&barrier, 0, order);
|
c89atomic_fetch_add_explicit_32(&barrier, 0, order);
|
||||||
}
|
}
|
||||||
#endif /* C89ATOMIC_X64 */
|
#endif
|
||||||
#else
|
#else
|
||||||
/* Old Visual C++. */
|
|
||||||
#if defined(__i386) || defined(_M_IX86)
|
#if defined(__i386) || defined(_M_IX86)
|
||||||
/* x86. Implemented via inlined assembly. */
|
|
||||||
|
|
||||||
/* thread_fence() */
|
|
||||||
static C89ATOMIC_INLINE void __stdcall c89atomic_thread_fence(int order)
|
static C89ATOMIC_INLINE void __stdcall c89atomic_thread_fence(int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint32 barrier;
|
volatile c89atomic_uint32 barrier;
|
||||||
@@ -7741,9 +7711,6 @@ typedef unsigned char c89atomic_flag;
|
|||||||
xchg barrier, eax
|
xchg barrier, eax
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* exchange() */
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_exchange_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_exchange_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
||||||
{
|
{
|
||||||
(void)order;
|
(void)order;
|
||||||
@@ -7753,7 +7720,6 @@ typedef unsigned char c89atomic_flag;
|
|||||||
lock xchg [ecx], al
|
lock xchg [ecx], al
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_exchange_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_exchange_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
||||||
{
|
{
|
||||||
(void)order;
|
(void)order;
|
||||||
@@ -7763,7 +7729,6 @@ typedef unsigned char c89atomic_flag;
|
|||||||
lock xchg [ecx], ax
|
lock xchg [ecx], ax
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_exchange_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_exchange_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
||||||
{
|
{
|
||||||
(void)order;
|
(void)order;
|
||||||
@@ -7773,9 +7738,6 @@ typedef unsigned char c89atomic_flag;
|
|||||||
lock xchg [ecx], eax
|
lock xchg [ecx], eax
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* fetch_add() */
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_add_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_add_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
||||||
{
|
{
|
||||||
(void)order;
|
(void)order;
|
||||||
@@ -7785,7 +7747,6 @@ typedef unsigned char c89atomic_flag;
|
|||||||
lock xadd [ecx], al
|
lock xadd [ecx], al
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_add_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_add_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
||||||
{
|
{
|
||||||
(void)order;
|
(void)order;
|
||||||
@@ -7795,7 +7756,6 @@ typedef unsigned char c89atomic_flag;
|
|||||||
lock xadd [ecx], ax
|
lock xadd [ecx], ax
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_add_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_add_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
||||||
{
|
{
|
||||||
(void)order;
|
(void)order;
|
||||||
@@ -7805,559 +7765,430 @@ typedef unsigned char c89atomic_flag;
|
|||||||
lock xadd [ecx], eax
|
lock xadd [ecx], eax
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* compare_and_swap() */
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_compare_and_swap_8(volatile c89atomic_uint8* dst, c89atomic_uint8 expected, c89atomic_uint8 desired)
|
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_compare_and_swap_8(volatile c89atomic_uint8* dst, c89atomic_uint8 expected, c89atomic_uint8 desired)
|
||||||
{
|
{
|
||||||
__asm {
|
__asm {
|
||||||
mov ecx, dst
|
mov ecx, dst
|
||||||
mov al, expected
|
mov al, expected
|
||||||
mov dl, desired
|
mov dl, desired
|
||||||
lock cmpxchg [ecx], dl /* Writes to EAX which MSVC will treat as the return value. */
|
lock cmpxchg [ecx], dl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_compare_and_swap_16(volatile c89atomic_uint16* dst, c89atomic_uint16 expected, c89atomic_uint16 desired)
|
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_compare_and_swap_16(volatile c89atomic_uint16* dst, c89atomic_uint16 expected, c89atomic_uint16 desired)
|
||||||
{
|
{
|
||||||
__asm {
|
__asm {
|
||||||
mov ecx, dst
|
mov ecx, dst
|
||||||
mov ax, expected
|
mov ax, expected
|
||||||
mov dx, desired
|
mov dx, desired
|
||||||
lock cmpxchg [ecx], dx /* Writes to EAX which MSVC will treat as the return value. */
|
lock cmpxchg [ecx], dx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_compare_and_swap_32(volatile c89atomic_uint32* dst, c89atomic_uint32 expected, c89atomic_uint32 desired)
|
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_compare_and_swap_32(volatile c89atomic_uint32* dst, c89atomic_uint32 expected, c89atomic_uint32 desired)
|
||||||
{
|
{
|
||||||
__asm {
|
__asm {
|
||||||
mov ecx, dst
|
mov ecx, dst
|
||||||
mov eax, expected
|
mov eax, expected
|
||||||
mov edx, desired
|
mov edx, desired
|
||||||
lock cmpxchg [ecx], edx /* Writes to EAX which MSVC will treat as the return value. */
|
lock cmpxchg [ecx], edx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_compare_and_swap_64(volatile c89atomic_uint64* dst, c89atomic_uint64 expected, c89atomic_uint64 desired)
|
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_compare_and_swap_64(volatile c89atomic_uint64* dst, c89atomic_uint64 expected, c89atomic_uint64 desired)
|
||||||
{
|
{
|
||||||
__asm {
|
__asm {
|
||||||
mov esi, dst /* From Microsoft documentation: "... you don't need to preserve the EAX, EBX, ECX, EDX, ESI, or EDI registers." Choosing ESI since it's the next available one in their list. */
|
mov esi, dst
|
||||||
mov eax, dword ptr expected
|
mov eax, dword ptr expected
|
||||||
mov edx, dword ptr expected + 4
|
mov edx, dword ptr expected + 4
|
||||||
mov ebx, dword ptr desired
|
mov ebx, dword ptr desired
|
||||||
mov ecx, dword ptr desired + 4
|
mov ecx, dword ptr desired + 4
|
||||||
lock cmpxchg8b qword ptr [esi] /* Writes to EAX:EDX which MSVC will treat as the return value. */
|
lock cmpxchg8b qword ptr [esi]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/* x64 or ARM. Should never get here because these are not valid targets for older versions of Visual Studio. */
|
|
||||||
error "Unsupported architecture."
|
error "Unsupported architecture."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
I'm not sure how to implement a compiler barrier for old MSVC so I'm just making it a thread_fence() and hopefull the compiler will see the volatile and not do
|
|
||||||
any reshuffling. If anybody has a better idea on this please let me know! Cannot use _ReadWriteBarrier() as it has been marked as deprecated.
|
|
||||||
*/
|
|
||||||
#define c89atomic_compiler_fence() c89atomic_thread_fence(c89atomic_memory_order_seq_cst)
|
#define c89atomic_compiler_fence() c89atomic_thread_fence(c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
/* I'm not sure how to implement this for MSVC. For now just using thread_fence(). */
|
|
||||||
#define c89atomic_signal_fence(order) c89atomic_thread_fence(order)
|
#define c89atomic_signal_fence(order) c89atomic_thread_fence(order)
|
||||||
|
|
||||||
/* Atomic loads can be implemented in terms of a compare-and-swap. */
|
|
||||||
#define c89atomic_load_explicit_8( ptr, order) c89atomic_compare_and_swap_8 (ptr, 0, 0)
|
#define c89atomic_load_explicit_8( ptr, order) c89atomic_compare_and_swap_8 (ptr, 0, 0)
|
||||||
#define c89atomic_load_explicit_16(ptr, order) c89atomic_compare_and_swap_16(ptr, 0, 0)
|
#define c89atomic_load_explicit_16(ptr, order) c89atomic_compare_and_swap_16(ptr, 0, 0)
|
||||||
#define c89atomic_load_explicit_32(ptr, order) c89atomic_compare_and_swap_32(ptr, 0, 0)
|
#define c89atomic_load_explicit_32(ptr, order) c89atomic_compare_and_swap_32(ptr, 0, 0)
|
||||||
#define c89atomic_load_explicit_64(ptr, order) c89atomic_compare_and_swap_64(ptr, 0, 0)
|
#define c89atomic_load_explicit_64(ptr, order) c89atomic_compare_and_swap_64(ptr, 0, 0)
|
||||||
|
|
||||||
/* atomic_store() is the same as atomic_exchange() but returns void. */
|
|
||||||
#define c89atomic_store_explicit_8( dst, src, order) (void)c89atomic_exchange_explicit_8 (dst, src, order)
|
#define c89atomic_store_explicit_8( dst, src, order) (void)c89atomic_exchange_explicit_8 (dst, src, order)
|
||||||
#define c89atomic_store_explicit_16(dst, src, order) (void)c89atomic_exchange_explicit_16(dst, src, order)
|
#define c89atomic_store_explicit_16(dst, src, order) (void)c89atomic_exchange_explicit_16(dst, src, order)
|
||||||
#define c89atomic_store_explicit_32(dst, src, order) (void)c89atomic_exchange_explicit_32(dst, src, order)
|
#define c89atomic_store_explicit_32(dst, src, order) (void)c89atomic_exchange_explicit_32(dst, src, order)
|
||||||
#define c89atomic_store_explicit_64(dst, src, order) (void)c89atomic_exchange_explicit_64(dst, src, order)
|
#define c89atomic_store_explicit_64(dst, src, order) (void)c89atomic_exchange_explicit_64(dst, src, order)
|
||||||
|
|
||||||
/* Some 64-bit atomic operations are not supported by MSVC when compiling in 32-bit mode.*/
|
|
||||||
#if defined(C89ATOMIC_32BIT)
|
#if defined(C89ATOMIC_32BIT)
|
||||||
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_exchange_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_exchange_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint64 oldValue;
|
volatile c89atomic_uint64 oldValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
} while (c89atomic_compare_and_swap_64(dst, oldValue, src) != oldValue);
|
} while (c89atomic_compare_and_swap_64(dst, oldValue, src) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_add_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_add_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint64 oldValue;
|
volatile c89atomic_uint64 oldValue;
|
||||||
volatile c89atomic_uint64 newValue;
|
volatile c89atomic_uint64 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue + src;
|
newValue = oldValue + src;
|
||||||
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* fetch_sub() */
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_sub_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_sub_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint8 oldValue;
|
volatile c89atomic_uint8 oldValue;
|
||||||
volatile c89atomic_uint8 newValue;
|
volatile c89atomic_uint8 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue - src;
|
newValue = oldValue - src;
|
||||||
} while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_sub_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_sub_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint16 oldValue;
|
volatile c89atomic_uint16 oldValue;
|
||||||
volatile c89atomic_uint16 newValue;
|
volatile c89atomic_uint16 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue - src;
|
newValue = oldValue - src;
|
||||||
} while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_sub_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_sub_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint32 oldValue;
|
volatile c89atomic_uint32 oldValue;
|
||||||
volatile c89atomic_uint32 newValue;
|
volatile c89atomic_uint32 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue - src;
|
newValue = oldValue - src;
|
||||||
} while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_sub_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_sub_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint64 oldValue;
|
volatile c89atomic_uint64 oldValue;
|
||||||
volatile c89atomic_uint64 newValue;
|
volatile c89atomic_uint64 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue - src;
|
newValue = oldValue - src;
|
||||||
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* fetch_and() */
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_and_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_and_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint8 oldValue;
|
volatile c89atomic_uint8 oldValue;
|
||||||
volatile c89atomic_uint8 newValue;
|
volatile c89atomic_uint8 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue & src;
|
newValue = oldValue & src;
|
||||||
} while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_and_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_and_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint16 oldValue;
|
volatile c89atomic_uint16 oldValue;
|
||||||
volatile c89atomic_uint16 newValue;
|
volatile c89atomic_uint16 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue & src;
|
newValue = oldValue & src;
|
||||||
} while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_and_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_and_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint32 oldValue;
|
volatile c89atomic_uint32 oldValue;
|
||||||
volatile c89atomic_uint32 newValue;
|
volatile c89atomic_uint32 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue & src;
|
newValue = oldValue & src;
|
||||||
} while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_and_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_and_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint64 oldValue;
|
volatile c89atomic_uint64 oldValue;
|
||||||
volatile c89atomic_uint64 newValue;
|
volatile c89atomic_uint64 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue & src;
|
newValue = oldValue & src;
|
||||||
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* fetch_xor() */
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_xor_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_xor_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint8 oldValue;
|
volatile c89atomic_uint8 oldValue;
|
||||||
volatile c89atomic_uint8 newValue;
|
volatile c89atomic_uint8 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue ^ src;
|
newValue = oldValue ^ src;
|
||||||
} while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_xor_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_xor_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint16 oldValue;
|
volatile c89atomic_uint16 oldValue;
|
||||||
volatile c89atomic_uint16 newValue;
|
volatile c89atomic_uint16 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue ^ src;
|
newValue = oldValue ^ src;
|
||||||
} while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_xor_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_xor_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint32 oldValue;
|
volatile c89atomic_uint32 oldValue;
|
||||||
volatile c89atomic_uint32 newValue;
|
volatile c89atomic_uint32 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue ^ src;
|
newValue = oldValue ^ src;
|
||||||
} while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_xor_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_xor_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint64 oldValue;
|
volatile c89atomic_uint64 oldValue;
|
||||||
volatile c89atomic_uint64 newValue;
|
volatile c89atomic_uint64 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue ^ src;
|
newValue = oldValue ^ src;
|
||||||
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* fetch_or() */
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_or_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_or_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint8 oldValue;
|
volatile c89atomic_uint8 oldValue;
|
||||||
volatile c89atomic_uint8 newValue;
|
volatile c89atomic_uint8 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue | src;
|
newValue = oldValue | src;
|
||||||
} while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_or_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_or_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint16 oldValue;
|
volatile c89atomic_uint16 oldValue;
|
||||||
volatile c89atomic_uint16 newValue;
|
volatile c89atomic_uint16 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue | src;
|
newValue = oldValue | src;
|
||||||
} while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_or_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_or_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint32 oldValue;
|
volatile c89atomic_uint32 oldValue;
|
||||||
volatile c89atomic_uint32 newValue;
|
volatile c89atomic_uint32 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue | src;
|
newValue = oldValue | src;
|
||||||
} while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_or_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_or_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, int order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint64 oldValue;
|
volatile c89atomic_uint64 oldValue;
|
||||||
volatile c89atomic_uint64 newValue;
|
volatile c89atomic_uint64 newValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
newValue = oldValue | src;
|
newValue = oldValue | src;
|
||||||
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
} while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define c89atomic_test_and_set_explicit_8( dst, order) c89atomic_exchange_explicit_8 (dst, 1, order)
|
#define c89atomic_test_and_set_explicit_8( dst, order) c89atomic_exchange_explicit_8 (dst, 1, order)
|
||||||
#define c89atomic_test_and_set_explicit_16(dst, order) c89atomic_exchange_explicit_16(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_16(dst, order) c89atomic_exchange_explicit_16(dst, 1, order)
|
||||||
#define c89atomic_test_and_set_explicit_32(dst, order) c89atomic_exchange_explicit_32(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_32(dst, order) c89atomic_exchange_explicit_32(dst, 1, order)
|
||||||
#define c89atomic_test_and_set_explicit_64(dst, order) c89atomic_exchange_explicit_64(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_64(dst, order) c89atomic_exchange_explicit_64(dst, 1, order)
|
||||||
|
|
||||||
#define c89atomic_clear_explicit_8( dst, order) c89atomic_store_explicit_8 (dst, 0, order)
|
#define c89atomic_clear_explicit_8( dst, order) c89atomic_store_explicit_8 (dst, 0, order)
|
||||||
#define c89atomic_clear_explicit_16(dst, order) c89atomic_store_explicit_16(dst, 0, order)
|
#define c89atomic_clear_explicit_16(dst, order) c89atomic_store_explicit_16(dst, 0, order)
|
||||||
#define c89atomic_clear_explicit_32(dst, order) c89atomic_store_explicit_32(dst, 0, order)
|
#define c89atomic_clear_explicit_32(dst, order) c89atomic_store_explicit_32(dst, 0, order)
|
||||||
#define c89atomic_clear_explicit_64(dst, order) c89atomic_store_explicit_64(dst, 0, order)
|
#define c89atomic_clear_explicit_64(dst, order) c89atomic_store_explicit_64(dst, 0, order)
|
||||||
|
|
||||||
#define c89atomic_flag_test_and_set_explicit(ptr, order) (c89atomic_flag)c89atomic_test_and_set_explicit_8(ptr, order)
|
#define c89atomic_flag_test_and_set_explicit(ptr, order) (c89atomic_flag)c89atomic_test_and_set_explicit_8(ptr, order)
|
||||||
#define c89atomic_flag_clear_explicit(ptr, order) c89atomic_clear_explicit_8(ptr, order)
|
#define c89atomic_flag_clear_explicit(ptr, order) c89atomic_clear_explicit_8(ptr, order)
|
||||||
#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC__ >= 7)))
|
#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC__ >= 7)))
|
||||||
/* Modern GCC atomic built-ins. */
|
|
||||||
#define C89ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE
|
#define C89ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE
|
||||||
#define C89ATOMIC_HAS_NATIVE_IS_LOCK_FREE
|
#define C89ATOMIC_HAS_NATIVE_IS_LOCK_FREE
|
||||||
|
|
||||||
#define c89atomic_memory_order_relaxed __ATOMIC_RELAXED
|
#define c89atomic_memory_order_relaxed __ATOMIC_RELAXED
|
||||||
#define c89atomic_memory_order_consume __ATOMIC_CONSUME
|
#define c89atomic_memory_order_consume __ATOMIC_CONSUME
|
||||||
#define c89atomic_memory_order_acquire __ATOMIC_ACQUIRE
|
#define c89atomic_memory_order_acquire __ATOMIC_ACQUIRE
|
||||||
#define c89atomic_memory_order_release __ATOMIC_RELEASE
|
#define c89atomic_memory_order_release __ATOMIC_RELEASE
|
||||||
#define c89atomic_memory_order_acq_rel __ATOMIC_ACQ_REL
|
#define c89atomic_memory_order_acq_rel __ATOMIC_ACQ_REL
|
||||||
#define c89atomic_memory_order_seq_cst __ATOMIC_SEQ_CST
|
#define c89atomic_memory_order_seq_cst __ATOMIC_SEQ_CST
|
||||||
|
|
||||||
#define c89atomic_compiler_fence() __asm__ __volatile__("":::"memory")
|
#define c89atomic_compiler_fence() __asm__ __volatile__("":::"memory")
|
||||||
#define c89atomic_thread_fence(order) __atomic_thread_fence(order)
|
#define c89atomic_thread_fence(order) __atomic_thread_fence(order)
|
||||||
#define c89atomic_signal_fence(order) __atomic_signal_fence(order)
|
#define c89atomic_signal_fence(order) __atomic_signal_fence(order)
|
||||||
|
|
||||||
#define c89atomic_is_lock_free_8(ptr) __atomic_is_lock_free(1, ptr)
|
#define c89atomic_is_lock_free_8(ptr) __atomic_is_lock_free(1, ptr)
|
||||||
#define c89atomic_is_lock_free_16(ptr) __atomic_is_lock_free(2, ptr)
|
#define c89atomic_is_lock_free_16(ptr) __atomic_is_lock_free(2, ptr)
|
||||||
#define c89atomic_is_lock_free_32(ptr) __atomic_is_lock_free(4, ptr)
|
#define c89atomic_is_lock_free_32(ptr) __atomic_is_lock_free(4, ptr)
|
||||||
#define c89atomic_is_lock_free_64(ptr) __atomic_is_lock_free(8, ptr)
|
#define c89atomic_is_lock_free_64(ptr) __atomic_is_lock_free(8, ptr)
|
||||||
|
|
||||||
#define c89atomic_flag_test_and_set_explicit(dst, order) (c89atomic_flag)__atomic_test_and_set(dst, order)
|
#define c89atomic_flag_test_and_set_explicit(dst, order) (c89atomic_flag)__atomic_test_and_set(dst, order)
|
||||||
#define c89atomic_flag_clear_explicit(dst, order) __atomic_clear(dst, order)
|
#define c89atomic_flag_clear_explicit(dst, order) __atomic_clear(dst, order)
|
||||||
|
|
||||||
#define c89atomic_test_and_set_explicit_8( dst, order) __atomic_exchange_n(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_8( dst, order) __atomic_exchange_n(dst, 1, order)
|
||||||
#define c89atomic_test_and_set_explicit_16(dst, order) __atomic_exchange_n(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_16(dst, order) __atomic_exchange_n(dst, 1, order)
|
||||||
#define c89atomic_test_and_set_explicit_32(dst, order) __atomic_exchange_n(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_32(dst, order) __atomic_exchange_n(dst, 1, order)
|
||||||
#define c89atomic_test_and_set_explicit_64(dst, order) __atomic_exchange_n(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_64(dst, order) __atomic_exchange_n(dst, 1, order)
|
||||||
|
|
||||||
#define c89atomic_clear_explicit_8( dst, order) __atomic_store_n(dst, 0, order)
|
#define c89atomic_clear_explicit_8( dst, order) __atomic_store_n(dst, 0, order)
|
||||||
#define c89atomic_clear_explicit_16(dst, order) __atomic_store_n(dst, 0, order)
|
#define c89atomic_clear_explicit_16(dst, order) __atomic_store_n(dst, 0, order)
|
||||||
#define c89atomic_clear_explicit_32(dst, order) __atomic_store_n(dst, 0, order)
|
#define c89atomic_clear_explicit_32(dst, order) __atomic_store_n(dst, 0, order)
|
||||||
#define c89atomic_clear_explicit_64(dst, order) __atomic_store_n(dst, 0, order)
|
#define c89atomic_clear_explicit_64(dst, order) __atomic_store_n(dst, 0, order)
|
||||||
|
|
||||||
#define c89atomic_store_explicit_8( dst, src, order) __atomic_store_n(dst, src, order)
|
#define c89atomic_store_explicit_8( dst, src, order) __atomic_store_n(dst, src, order)
|
||||||
#define c89atomic_store_explicit_16(dst, src, order) __atomic_store_n(dst, src, order)
|
#define c89atomic_store_explicit_16(dst, src, order) __atomic_store_n(dst, src, order)
|
||||||
#define c89atomic_store_explicit_32(dst, src, order) __atomic_store_n(dst, src, order)
|
#define c89atomic_store_explicit_32(dst, src, order) __atomic_store_n(dst, src, order)
|
||||||
#define c89atomic_store_explicit_64(dst, src, order) __atomic_store_n(dst, src, order)
|
#define c89atomic_store_explicit_64(dst, src, order) __atomic_store_n(dst, src, order)
|
||||||
|
|
||||||
#define c89atomic_load_explicit_8( dst, order) __atomic_load_n(dst, order)
|
#define c89atomic_load_explicit_8( dst, order) __atomic_load_n(dst, order)
|
||||||
#define c89atomic_load_explicit_16(dst, order) __atomic_load_n(dst, order)
|
#define c89atomic_load_explicit_16(dst, order) __atomic_load_n(dst, order)
|
||||||
#define c89atomic_load_explicit_32(dst, order) __atomic_load_n(dst, order)
|
#define c89atomic_load_explicit_32(dst, order) __atomic_load_n(dst, order)
|
||||||
#define c89atomic_load_explicit_64(dst, order) __atomic_load_n(dst, order)
|
#define c89atomic_load_explicit_64(dst, order) __atomic_load_n(dst, order)
|
||||||
|
|
||||||
#define c89atomic_exchange_explicit_8( dst, src, order) __atomic_exchange_n(dst, src, order)
|
#define c89atomic_exchange_explicit_8( dst, src, order) __atomic_exchange_n(dst, src, order)
|
||||||
#define c89atomic_exchange_explicit_16(dst, src, order) __atomic_exchange_n(dst, src, order)
|
#define c89atomic_exchange_explicit_16(dst, src, order) __atomic_exchange_n(dst, src, order)
|
||||||
#define c89atomic_exchange_explicit_32(dst, src, order) __atomic_exchange_n(dst, src, order)
|
#define c89atomic_exchange_explicit_32(dst, src, order) __atomic_exchange_n(dst, src, order)
|
||||||
#define c89atomic_exchange_explicit_64(dst, src, order) __atomic_exchange_n(dst, src, order)
|
#define c89atomic_exchange_explicit_64(dst, src, order) __atomic_exchange_n(dst, src, order)
|
||||||
|
|
||||||
#define c89atomic_compare_exchange_strong_explicit_8( dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_strong_explicit_8( dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)
|
||||||
#define c89atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)
|
||||||
#define c89atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)
|
||||||
#define c89atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)
|
||||||
|
|
||||||
#define c89atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)
|
||||||
#define c89atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)
|
||||||
#define c89atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)
|
||||||
#define c89atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)
|
||||||
|
|
||||||
#define c89atomic_fetch_add_explicit_8( dst, src, order) __atomic_fetch_add(dst, src, order)
|
#define c89atomic_fetch_add_explicit_8( dst, src, order) __atomic_fetch_add(dst, src, order)
|
||||||
#define c89atomic_fetch_add_explicit_16(dst, src, order) __atomic_fetch_add(dst, src, order)
|
#define c89atomic_fetch_add_explicit_16(dst, src, order) __atomic_fetch_add(dst, src, order)
|
||||||
#define c89atomic_fetch_add_explicit_32(dst, src, order) __atomic_fetch_add(dst, src, order)
|
#define c89atomic_fetch_add_explicit_32(dst, src, order) __atomic_fetch_add(dst, src, order)
|
||||||
#define c89atomic_fetch_add_explicit_64(dst, src, order) __atomic_fetch_add(dst, src, order)
|
#define c89atomic_fetch_add_explicit_64(dst, src, order) __atomic_fetch_add(dst, src, order)
|
||||||
|
|
||||||
#define c89atomic_fetch_sub_explicit_8( dst, src, order) __atomic_fetch_sub(dst, src, order)
|
#define c89atomic_fetch_sub_explicit_8( dst, src, order) __atomic_fetch_sub(dst, src, order)
|
||||||
#define c89atomic_fetch_sub_explicit_16(dst, src, order) __atomic_fetch_sub(dst, src, order)
|
#define c89atomic_fetch_sub_explicit_16(dst, src, order) __atomic_fetch_sub(dst, src, order)
|
||||||
#define c89atomic_fetch_sub_explicit_32(dst, src, order) __atomic_fetch_sub(dst, src, order)
|
#define c89atomic_fetch_sub_explicit_32(dst, src, order) __atomic_fetch_sub(dst, src, order)
|
||||||
#define c89atomic_fetch_sub_explicit_64(dst, src, order) __atomic_fetch_sub(dst, src, order)
|
#define c89atomic_fetch_sub_explicit_64(dst, src, order) __atomic_fetch_sub(dst, src, order)
|
||||||
|
|
||||||
#define c89atomic_fetch_or_explicit_8( dst, src, order) __atomic_fetch_or(dst, src, order)
|
#define c89atomic_fetch_or_explicit_8( dst, src, order) __atomic_fetch_or(dst, src, order)
|
||||||
#define c89atomic_fetch_or_explicit_16(dst, src, order) __atomic_fetch_or(dst, src, order)
|
#define c89atomic_fetch_or_explicit_16(dst, src, order) __atomic_fetch_or(dst, src, order)
|
||||||
#define c89atomic_fetch_or_explicit_32(dst, src, order) __atomic_fetch_or(dst, src, order)
|
#define c89atomic_fetch_or_explicit_32(dst, src, order) __atomic_fetch_or(dst, src, order)
|
||||||
#define c89atomic_fetch_or_explicit_64(dst, src, order) __atomic_fetch_or(dst, src, order)
|
#define c89atomic_fetch_or_explicit_64(dst, src, order) __atomic_fetch_or(dst, src, order)
|
||||||
|
|
||||||
#define c89atomic_fetch_xor_explicit_8( dst, src, order) __atomic_fetch_xor(dst, src, order)
|
#define c89atomic_fetch_xor_explicit_8( dst, src, order) __atomic_fetch_xor(dst, src, order)
|
||||||
#define c89atomic_fetch_xor_explicit_16(dst, src, order) __atomic_fetch_xor(dst, src, order)
|
#define c89atomic_fetch_xor_explicit_16(dst, src, order) __atomic_fetch_xor(dst, src, order)
|
||||||
#define c89atomic_fetch_xor_explicit_32(dst, src, order) __atomic_fetch_xor(dst, src, order)
|
#define c89atomic_fetch_xor_explicit_32(dst, src, order) __atomic_fetch_xor(dst, src, order)
|
||||||
#define c89atomic_fetch_xor_explicit_64(dst, src, order) __atomic_fetch_xor(dst, src, order)
|
#define c89atomic_fetch_xor_explicit_64(dst, src, order) __atomic_fetch_xor(dst, src, order)
|
||||||
|
|
||||||
#define c89atomic_fetch_and_explicit_8( dst, src, order) __atomic_fetch_and(dst, src, order)
|
#define c89atomic_fetch_and_explicit_8( dst, src, order) __atomic_fetch_and(dst, src, order)
|
||||||
#define c89atomic_fetch_and_explicit_16(dst, src, order) __atomic_fetch_and(dst, src, order)
|
#define c89atomic_fetch_and_explicit_16(dst, src, order) __atomic_fetch_and(dst, src, order)
|
||||||
#define c89atomic_fetch_and_explicit_32(dst, src, order) __atomic_fetch_and(dst, src, order)
|
#define c89atomic_fetch_and_explicit_32(dst, src, order) __atomic_fetch_and(dst, src, order)
|
||||||
#define c89atomic_fetch_and_explicit_64(dst, src, order) __atomic_fetch_and(dst, src, order)
|
#define c89atomic_fetch_and_explicit_64(dst, src, order) __atomic_fetch_and(dst, src, order)
|
||||||
|
|
||||||
#define c89atomic_compare_and_swap_8 (dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
#define c89atomic_compare_and_swap_8 (dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
||||||
#define c89atomic_compare_and_swap_16(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
#define c89atomic_compare_and_swap_16(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
||||||
#define c89atomic_compare_and_swap_32(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
#define c89atomic_compare_and_swap_32(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
||||||
#define c89atomic_compare_and_swap_64(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
#define c89atomic_compare_and_swap_64(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
||||||
#else
|
#else
|
||||||
/* Legacy GCC atomic built-ins. Everything is a full memory barrier. */
|
|
||||||
#define c89atomic_memory_order_relaxed 1
|
#define c89atomic_memory_order_relaxed 1
|
||||||
#define c89atomic_memory_order_consume 2
|
#define c89atomic_memory_order_consume 2
|
||||||
#define c89atomic_memory_order_acquire 3
|
#define c89atomic_memory_order_acquire 3
|
||||||
#define c89atomic_memory_order_release 4
|
#define c89atomic_memory_order_release 4
|
||||||
#define c89atomic_memory_order_acq_rel 5
|
#define c89atomic_memory_order_acq_rel 5
|
||||||
#define c89atomic_memory_order_seq_cst 6
|
#define c89atomic_memory_order_seq_cst 6
|
||||||
|
|
||||||
#define c89atomic_compiler_fence() __asm__ __volatile__("":::"memory")
|
#define c89atomic_compiler_fence() __asm__ __volatile__("":::"memory")
|
||||||
#define c89atomic_thread_fence(order) __sync_synchronize()
|
#define c89atomic_thread_fence(order) __sync_synchronize()
|
||||||
#define c89atomic_signal_fence(order) c89atomic_thread_fence(order)
|
#define c89atomic_signal_fence(order) c89atomic_thread_fence(order)
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_exchange_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order)
|
static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_exchange_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order)
|
||||||
{
|
{
|
||||||
if (order > c89atomic_memory_order_acquire) {
|
if (order > c89atomic_memory_order_acquire) {
|
||||||
__sync_synchronize();
|
__sync_synchronize();
|
||||||
}
|
}
|
||||||
|
|
||||||
return __sync_lock_test_and_set(dst, src);
|
return __sync_lock_test_and_set(dst, src);
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_exchange_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order)
|
static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_exchange_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint16 oldValue;
|
volatile c89atomic_uint16 oldValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
} while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue);
|
} while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_exchange_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order)
|
static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_exchange_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint32 oldValue;
|
volatile c89atomic_uint32 oldValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
} while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue);
|
} while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_exchange_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order)
|
static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_exchange_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order)
|
||||||
{
|
{
|
||||||
volatile c89atomic_uint64 oldValue;
|
volatile c89atomic_uint64 oldValue;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
oldValue = *dst;
|
oldValue = *dst;
|
||||||
} while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue);
|
} while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue);
|
||||||
|
|
||||||
(void)order;
|
(void)order;
|
||||||
return oldValue;
|
return oldValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define c89atomic_fetch_add_explicit_8( dst, src, order) __sync_fetch_and_add(dst, src)
|
#define c89atomic_fetch_add_explicit_8( dst, src, order) __sync_fetch_and_add(dst, src)
|
||||||
#define c89atomic_fetch_add_explicit_16(dst, src, order) __sync_fetch_and_add(dst, src)
|
#define c89atomic_fetch_add_explicit_16(dst, src, order) __sync_fetch_and_add(dst, src)
|
||||||
#define c89atomic_fetch_add_explicit_32(dst, src, order) __sync_fetch_and_add(dst, src)
|
#define c89atomic_fetch_add_explicit_32(dst, src, order) __sync_fetch_and_add(dst, src)
|
||||||
#define c89atomic_fetch_add_explicit_64(dst, src, order) __sync_fetch_and_add(dst, src)
|
#define c89atomic_fetch_add_explicit_64(dst, src, order) __sync_fetch_and_add(dst, src)
|
||||||
|
|
||||||
#define c89atomic_fetch_sub_explicit_8( dst, src, order) __sync_fetch_and_sub(dst, src)
|
#define c89atomic_fetch_sub_explicit_8( dst, src, order) __sync_fetch_and_sub(dst, src)
|
||||||
#define c89atomic_fetch_sub_explicit_16(dst, src, order) __sync_fetch_and_sub(dst, src)
|
#define c89atomic_fetch_sub_explicit_16(dst, src, order) __sync_fetch_and_sub(dst, src)
|
||||||
#define c89atomic_fetch_sub_explicit_32(dst, src, order) __sync_fetch_and_sub(dst, src)
|
#define c89atomic_fetch_sub_explicit_32(dst, src, order) __sync_fetch_and_sub(dst, src)
|
||||||
#define c89atomic_fetch_sub_explicit_64(dst, src, order) __sync_fetch_and_sub(dst, src)
|
#define c89atomic_fetch_sub_explicit_64(dst, src, order) __sync_fetch_and_sub(dst, src)
|
||||||
|
|
||||||
#define c89atomic_fetch_or_explicit_8( dst, src, order) __sync_fetch_and_or(dst, src)
|
#define c89atomic_fetch_or_explicit_8( dst, src, order) __sync_fetch_and_or(dst, src)
|
||||||
#define c89atomic_fetch_or_explicit_16(dst, src, order) __sync_fetch_and_or(dst, src)
|
#define c89atomic_fetch_or_explicit_16(dst, src, order) __sync_fetch_and_or(dst, src)
|
||||||
#define c89atomic_fetch_or_explicit_32(dst, src, order) __sync_fetch_and_or(dst, src)
|
#define c89atomic_fetch_or_explicit_32(dst, src, order) __sync_fetch_and_or(dst, src)
|
||||||
#define c89atomic_fetch_or_explicit_64(dst, src, order) __sync_fetch_and_or(dst, src)
|
#define c89atomic_fetch_or_explicit_64(dst, src, order) __sync_fetch_and_or(dst, src)
|
||||||
|
|
||||||
#define c89atomic_fetch_xor_explicit_8( dst, src, order) __sync_fetch_and_xor(dst, src)
|
#define c89atomic_fetch_xor_explicit_8( dst, src, order) __sync_fetch_and_xor(dst, src)
|
||||||
#define c89atomic_fetch_xor_explicit_16(dst, src, order) __sync_fetch_and_xor(dst, src)
|
#define c89atomic_fetch_xor_explicit_16(dst, src, order) __sync_fetch_and_xor(dst, src)
|
||||||
#define c89atomic_fetch_xor_explicit_32(dst, src, order) __sync_fetch_and_xor(dst, src)
|
#define c89atomic_fetch_xor_explicit_32(dst, src, order) __sync_fetch_and_xor(dst, src)
|
||||||
#define c89atomic_fetch_xor_explicit_64(dst, src, order) __sync_fetch_and_xor(dst, src)
|
#define c89atomic_fetch_xor_explicit_64(dst, src, order) __sync_fetch_and_xor(dst, src)
|
||||||
|
|
||||||
#define c89atomic_fetch_and_explicit_8( dst, src, order) __sync_fetch_and_and(dst, src)
|
#define c89atomic_fetch_and_explicit_8( dst, src, order) __sync_fetch_and_and(dst, src)
|
||||||
#define c89atomic_fetch_and_explicit_16(dst, src, order) __sync_fetch_and_and(dst, src)
|
#define c89atomic_fetch_and_explicit_16(dst, src, order) __sync_fetch_and_and(dst, src)
|
||||||
#define c89atomic_fetch_and_explicit_32(dst, src, order) __sync_fetch_and_and(dst, src)
|
#define c89atomic_fetch_and_explicit_32(dst, src, order) __sync_fetch_and_and(dst, src)
|
||||||
#define c89atomic_fetch_and_explicit_64(dst, src, order) __sync_fetch_and_and(dst, src)
|
#define c89atomic_fetch_and_explicit_64(dst, src, order) __sync_fetch_and_and(dst, src)
|
||||||
|
|
||||||
#define c89atomic_compare_and_swap_8( dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
#define c89atomic_compare_and_swap_8( dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
||||||
#define c89atomic_compare_and_swap_16(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
#define c89atomic_compare_and_swap_16(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
||||||
#define c89atomic_compare_and_swap_32(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
#define c89atomic_compare_and_swap_32(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
||||||
#define c89atomic_compare_and_swap_64(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
#define c89atomic_compare_and_swap_64(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired)
|
||||||
|
|
||||||
#define c89atomic_load_explicit_8( ptr, order) c89atomic_compare_and_swap_8 (ptr, 0, 0)
|
#define c89atomic_load_explicit_8( ptr, order) c89atomic_compare_and_swap_8 (ptr, 0, 0)
|
||||||
#define c89atomic_load_explicit_16(ptr, order) c89atomic_compare_and_swap_16(ptr, 0, 0)
|
#define c89atomic_load_explicit_16(ptr, order) c89atomic_compare_and_swap_16(ptr, 0, 0)
|
||||||
#define c89atomic_load_explicit_32(ptr, order) c89atomic_compare_and_swap_32(ptr, 0, 0)
|
#define c89atomic_load_explicit_32(ptr, order) c89atomic_compare_and_swap_32(ptr, 0, 0)
|
||||||
#define c89atomic_load_explicit_64(ptr, order) c89atomic_compare_and_swap_64(ptr, 0, 0)
|
#define c89atomic_load_explicit_64(ptr, order) c89atomic_compare_and_swap_64(ptr, 0, 0)
|
||||||
|
|
||||||
#define c89atomic_store_explicit_8( dst, src, order) (void)c89atomic_exchange_explicit_8 (dst, src, order)
|
#define c89atomic_store_explicit_8( dst, src, order) (void)c89atomic_exchange_explicit_8 (dst, src, order)
|
||||||
#define c89atomic_store_explicit_16(dst, src, order) (void)c89atomic_exchange_explicit_16(dst, src, order)
|
#define c89atomic_store_explicit_16(dst, src, order) (void)c89atomic_exchange_explicit_16(dst, src, order)
|
||||||
#define c89atomic_store_explicit_32(dst, src, order) (void)c89atomic_exchange_explicit_32(dst, src, order)
|
#define c89atomic_store_explicit_32(dst, src, order) (void)c89atomic_exchange_explicit_32(dst, src, order)
|
||||||
#define c89atomic_store_explicit_64(dst, src, order) (void)c89atomic_exchange_explicit_64(dst, src, order)
|
#define c89atomic_store_explicit_64(dst, src, order) (void)c89atomic_exchange_explicit_64(dst, src, order)
|
||||||
|
|
||||||
#define c89atomic_test_and_set_explicit_8( dst, order) c89atomic_exchange_explicit_8 (dst, 1, order)
|
#define c89atomic_test_and_set_explicit_8( dst, order) c89atomic_exchange_explicit_8 (dst, 1, order)
|
||||||
#define c89atomic_test_and_set_explicit_16(dst, order) c89atomic_exchange_explicit_16(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_16(dst, order) c89atomic_exchange_explicit_16(dst, 1, order)
|
||||||
#define c89atomic_test_and_set_explicit_32(dst, order) c89atomic_exchange_explicit_32(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_32(dst, order) c89atomic_exchange_explicit_32(dst, 1, order)
|
||||||
#define c89atomic_test_and_set_explicit_64(dst, order) c89atomic_exchange_explicit_64(dst, 1, order)
|
#define c89atomic_test_and_set_explicit_64(dst, order) c89atomic_exchange_explicit_64(dst, 1, order)
|
||||||
|
|
||||||
#define c89atomic_clear_explicit_8( dst, order) c89atomic_store_explicit_8 (dst, 0, order)
|
#define c89atomic_clear_explicit_8( dst, order) c89atomic_store_explicit_8 (dst, 0, order)
|
||||||
#define c89atomic_clear_explicit_16(dst, order) c89atomic_store_explicit_16(dst, 0, order)
|
#define c89atomic_clear_explicit_16(dst, order) c89atomic_store_explicit_16(dst, 0, order)
|
||||||
#define c89atomic_clear_explicit_32(dst, order) c89atomic_store_explicit_32(dst, 0, order)
|
#define c89atomic_clear_explicit_32(dst, order) c89atomic_store_explicit_32(dst, 0, order)
|
||||||
#define c89atomic_clear_explicit_64(dst, order) c89atomic_store_explicit_64(dst, 0, order)
|
#define c89atomic_clear_explicit_64(dst, order) c89atomic_store_explicit_64(dst, 0, order)
|
||||||
|
|
||||||
#define c89atomic_flag_test_and_set_explicit(ptr, order) (c89atomic_flag)c89atomic_test_and_set_explicit_8(ptr, order)
|
#define c89atomic_flag_test_and_set_explicit(ptr, order) (c89atomic_flag)c89atomic_test_and_set_explicit_8(ptr, order)
|
||||||
#define c89atomic_flag_clear_explicit(ptr, order) c89atomic_clear_explicit_8(ptr, order)
|
#define c89atomic_flag_clear_explicit(ptr, order) c89atomic_clear_explicit_8(ptr, order)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* compare_exchange() */
|
|
||||||
#if !defined(C89ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE)
|
#if !defined(C89ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE)
|
||||||
c89atomic_bool c89atomic_compare_exchange_strong_explicit_8(volatile c89atomic_uint8* dst, volatile c89atomic_uint8* expected, c89atomic_uint8 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder)
|
c89atomic_bool c89atomic_compare_exchange_strong_explicit_8(volatile c89atomic_uint8* dst, volatile c89atomic_uint8* expected, c89atomic_uint8 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder)
|
||||||
{
|
{
|
||||||
c89atomic_uint8 expectedValue;
|
c89atomic_uint8 expectedValue;
|
||||||
c89atomic_uint8 result;
|
c89atomic_uint8 result;
|
||||||
|
|
||||||
(void)successOrder;
|
(void)successOrder;
|
||||||
(void)failureOrder;
|
(void)failureOrder;
|
||||||
|
|
||||||
expectedValue = c89atomic_load_explicit_8(expected, c89atomic_memory_order_seq_cst);
|
expectedValue = c89atomic_load_explicit_8(expected, c89atomic_memory_order_seq_cst);
|
||||||
result = c89atomic_compare_and_swap_8(dst, expectedValue, desired);
|
result = c89atomic_compare_and_swap_8(dst, expectedValue, desired);
|
||||||
if (result == expectedValue) {
|
if (result == expectedValue) {
|
||||||
@@ -8367,15 +8198,12 @@ c89atomic_bool c89atomic_compare_exchange_strong_explicit_8(volatile c89atomic_u
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c89atomic_bool c89atomic_compare_exchange_strong_explicit_16(volatile c89atomic_uint16* dst, volatile c89atomic_uint16* expected, c89atomic_uint16 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder)
|
c89atomic_bool c89atomic_compare_exchange_strong_explicit_16(volatile c89atomic_uint16* dst, volatile c89atomic_uint16* expected, c89atomic_uint16 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder)
|
||||||
{
|
{
|
||||||
c89atomic_uint16 expectedValue;
|
c89atomic_uint16 expectedValue;
|
||||||
c89atomic_uint16 result;
|
c89atomic_uint16 result;
|
||||||
|
|
||||||
(void)successOrder;
|
(void)successOrder;
|
||||||
(void)failureOrder;
|
(void)failureOrder;
|
||||||
|
|
||||||
expectedValue = c89atomic_load_explicit_16(expected, c89atomic_memory_order_seq_cst);
|
expectedValue = c89atomic_load_explicit_16(expected, c89atomic_memory_order_seq_cst);
|
||||||
result = c89atomic_compare_and_swap_16(dst, expectedValue, desired);
|
result = c89atomic_compare_and_swap_16(dst, expectedValue, desired);
|
||||||
if (result == expectedValue) {
|
if (result == expectedValue) {
|
||||||
@@ -8385,15 +8213,12 @@ c89atomic_bool c89atomic_compare_exchange_strong_explicit_16(volatile c89atomic_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c89atomic_bool c89atomic_compare_exchange_strong_explicit_32(volatile c89atomic_uint32* dst, volatile c89atomic_uint32* expected, c89atomic_uint32 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder)
|
c89atomic_bool c89atomic_compare_exchange_strong_explicit_32(volatile c89atomic_uint32* dst, volatile c89atomic_uint32* expected, c89atomic_uint32 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder)
|
||||||
{
|
{
|
||||||
c89atomic_uint32 expectedValue;
|
c89atomic_uint32 expectedValue;
|
||||||
c89atomic_uint32 result;
|
c89atomic_uint32 result;
|
||||||
|
|
||||||
(void)successOrder;
|
(void)successOrder;
|
||||||
(void)failureOrder;
|
(void)failureOrder;
|
||||||
|
|
||||||
expectedValue = c89atomic_load_explicit_32(expected, c89atomic_memory_order_seq_cst);
|
expectedValue = c89atomic_load_explicit_32(expected, c89atomic_memory_order_seq_cst);
|
||||||
result = c89atomic_compare_and_swap_32(dst, expectedValue, desired);
|
result = c89atomic_compare_and_swap_32(dst, expectedValue, desired);
|
||||||
if (result == expectedValue) {
|
if (result == expectedValue) {
|
||||||
@@ -8403,15 +8228,12 @@ c89atomic_bool c89atomic_compare_exchange_strong_explicit_32(volatile c89atomic_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c89atomic_bool c89atomic_compare_exchange_strong_explicit_64(volatile c89atomic_uint64* dst, volatile c89atomic_uint64* expected, c89atomic_uint64 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder)
|
c89atomic_bool c89atomic_compare_exchange_strong_explicit_64(volatile c89atomic_uint64* dst, volatile c89atomic_uint64* expected, c89atomic_uint64 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder)
|
||||||
{
|
{
|
||||||
c89atomic_uint64 expectedValue;
|
c89atomic_uint64 expectedValue;
|
||||||
c89atomic_uint64 result;
|
c89atomic_uint64 result;
|
||||||
|
|
||||||
(void)successOrder;
|
(void)successOrder;
|
||||||
(void)failureOrder;
|
(void)failureOrder;
|
||||||
|
|
||||||
expectedValue = c89atomic_load_explicit_64(expected, c89atomic_memory_order_seq_cst);
|
expectedValue = c89atomic_load_explicit_64(expected, c89atomic_memory_order_seq_cst);
|
||||||
result = c89atomic_compare_and_swap_64(dst, expectedValue, desired);
|
result = c89atomic_compare_and_swap_64(dst, expectedValue, desired);
|
||||||
if (result == expectedValue) {
|
if (result == expectedValue) {
|
||||||
@@ -8421,19 +8243,15 @@ c89atomic_bool c89atomic_compare_exchange_strong_explicit_64(volatile c89atomic_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define c89atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_8 (dst, expected, desired, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_8 (dst, expected, desired, successOrder, failureOrder)
|
||||||
#define c89atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder)
|
||||||
#define c89atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder)
|
||||||
#define c89atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder)
|
#define c89atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder)
|
||||||
#endif /* C89ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE */
|
#endif
|
||||||
|
|
||||||
#if !defined(C89ATOMIC_HAS_NATIVE_IS_LOCK_FREE)
|
#if !defined(C89ATOMIC_HAS_NATIVE_IS_LOCK_FREE)
|
||||||
#define c89atomic_is_lock_free_8( ptr) 1
|
#define c89atomic_is_lock_free_8( ptr) 1
|
||||||
#define c89atomic_is_lock_free_16(ptr) 1
|
#define c89atomic_is_lock_free_16(ptr) 1
|
||||||
#define c89atomic_is_lock_free_32(ptr) 1
|
#define c89atomic_is_lock_free_32(ptr) 1
|
||||||
|
|
||||||
/* For 64-bit atomics, we can only safely say atomics are lock free on 64-bit architectures or x86. Otherwise we need to be conservative and assume not lock free. */
|
|
||||||
#if defined(C89ATOMIC_64BIT)
|
#if defined(C89ATOMIC_64BIT)
|
||||||
#define c89atomic_is_lock_free_64(ptr) 1
|
#define c89atomic_is_lock_free_64(ptr) 1
|
||||||
#else
|
#else
|
||||||
@@ -8443,9 +8261,7 @@ c89atomic_bool c89atomic_compare_exchange_strong_explicit_64(volatile c89atomic_
|
|||||||
#define c89atomic_is_lock_free_64(ptr) 0
|
#define c89atomic_is_lock_free_64(ptr) 0
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif /* C89ATOMIC_HAS_NATIVE_IS_LOCK_FREE */
|
#endif
|
||||||
|
|
||||||
/* Pointer versions of relevant operations. */
|
|
||||||
#if defined(C89ATOMIC_64BIT)
|
#if defined(C89ATOMIC_64BIT)
|
||||||
#define c89atomic_is_lock_free_ptr(ptr) c89atomic_is_lock_free_64((volatile c89atomic_uint64*)ptr)
|
#define c89atomic_is_lock_free_ptr(ptr) c89atomic_is_lock_free_64((volatile c89atomic_uint64*)ptr)
|
||||||
#define c89atomic_load_explicit_ptr(ptr, order) (void*)c89atomic_load_explicit_64((volatile c89atomic_uint64*)ptr, order)
|
#define c89atomic_load_explicit_ptr(ptr, order) (void*)c89atomic_load_explicit_64((volatile c89atomic_uint64*)ptr, order)
|
||||||
@@ -8465,79 +8281,65 @@ c89atomic_bool c89atomic_compare_exchange_strong_explicit_64(volatile c89atomic_
|
|||||||
#else
|
#else
|
||||||
error "Unsupported architecture."
|
error "Unsupported architecture."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define c89atomic_flag_test_and_set(ptr) c89atomic_flag_test_and_set_explicit(ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_flag_test_and_set(ptr) c89atomic_flag_test_and_set_explicit(ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_flag_clear(ptr) c89atomic_flag_clear_explicit(ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_flag_clear(ptr) c89atomic_flag_clear_explicit(ptr, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_test_and_set_8( ptr) c89atomic_test_and_set_explicit_8 (ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_test_and_set_8( ptr) c89atomic_test_and_set_explicit_8 (ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_test_and_set_16(ptr) c89atomic_test_and_set_explicit_16(ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_test_and_set_16(ptr) c89atomic_test_and_set_explicit_16(ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_test_and_set_32(ptr) c89atomic_test_and_set_explicit_32(ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_test_and_set_32(ptr) c89atomic_test_and_set_explicit_32(ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_test_and_set_64(ptr) c89atomic_test_and_set_explicit_64(ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_test_and_set_64(ptr) c89atomic_test_and_set_explicit_64(ptr, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_clear_8( ptr) c89atomic_clear_explicit_8 (ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_clear_8( ptr) c89atomic_clear_explicit_8 (ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_clear_16(ptr) c89atomic_clear_explicit_16(ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_clear_16(ptr) c89atomic_clear_explicit_16(ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_clear_32(ptr) c89atomic_clear_explicit_32(ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_clear_32(ptr) c89atomic_clear_explicit_32(ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_clear_64(ptr) c89atomic_clear_explicit_64(ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_clear_64(ptr) c89atomic_clear_explicit_64(ptr, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_store_8( dst, src) c89atomic_store_explicit_8 ( dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_store_8( dst, src) c89atomic_store_explicit_8 ( dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_store_16( dst, src) c89atomic_store_explicit_16( dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_store_16( dst, src) c89atomic_store_explicit_16( dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_store_32( dst, src) c89atomic_store_explicit_32( dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_store_32( dst, src) c89atomic_store_explicit_32( dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_store_64( dst, src) c89atomic_store_explicit_64( dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_store_64( dst, src) c89atomic_store_explicit_64( dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_store_ptr(dst, src) c89atomic_store_explicit_ptr(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_store_ptr(dst, src) c89atomic_store_explicit_ptr(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_load_8( ptr) c89atomic_load_explicit_8 ( ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_load_8( ptr) c89atomic_load_explicit_8 ( ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_load_16( ptr) c89atomic_load_explicit_16( ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_load_16( ptr) c89atomic_load_explicit_16( ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_load_32( ptr) c89atomic_load_explicit_32( ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_load_32( ptr) c89atomic_load_explicit_32( ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_load_64( ptr) c89atomic_load_explicit_64( ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_load_64( ptr) c89atomic_load_explicit_64( ptr, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_load_ptr(ptr) c89atomic_load_explicit_ptr(ptr, c89atomic_memory_order_seq_cst)
|
#define c89atomic_load_ptr(ptr) c89atomic_load_explicit_ptr(ptr, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_exchange_8( dst, src) c89atomic_exchange_explicit_8 ( dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_exchange_8( dst, src) c89atomic_exchange_explicit_8 ( dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_exchange_16( dst, src) c89atomic_exchange_explicit_16( dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_exchange_16( dst, src) c89atomic_exchange_explicit_16( dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_exchange_32( dst, src) c89atomic_exchange_explicit_32( dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_exchange_32( dst, src) c89atomic_exchange_explicit_32( dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_exchange_64( dst, src) c89atomic_exchange_explicit_64( dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_exchange_64( dst, src) c89atomic_exchange_explicit_64( dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_exchange_ptr(dst, src) c89atomic_exchange_explicit_ptr(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_exchange_ptr(dst, src) c89atomic_exchange_explicit_ptr(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_compare_exchange_strong_8( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_8 ( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_strong_8( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_8 ( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_compare_exchange_strong_16( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_16( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_strong_16( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_16( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_compare_exchange_strong_32( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_32( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_strong_32( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_32( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_compare_exchange_strong_64( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_64( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_strong_64( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_64( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_compare_exchange_strong_ptr(dst, expected, desired) c89atomic_compare_exchange_strong_explicit_ptr(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_strong_ptr(dst, expected, desired) c89atomic_compare_exchange_strong_explicit_ptr(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_compare_exchange_weak_8( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_8 ( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_weak_8( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_8 ( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_compare_exchange_weak_16( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_16( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_weak_16( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_16( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_compare_exchange_weak_32( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_32( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_weak_32( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_32( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_compare_exchange_weak_64( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_64( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_weak_64( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_64( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_compare_exchange_weak_ptr(dst, expected, desired) c89atomic_compare_exchange_weak_explicit_ptr(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
#define c89atomic_compare_exchange_weak_ptr(dst, expected, desired) c89atomic_compare_exchange_weak_explicit_ptr(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_fetch_add_8( dst, src) c89atomic_fetch_add_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_add_8( dst, src) c89atomic_fetch_add_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_add_16(dst, src) c89atomic_fetch_add_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_add_16(dst, src) c89atomic_fetch_add_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_add_32(dst, src) c89atomic_fetch_add_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_add_32(dst, src) c89atomic_fetch_add_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_add_64(dst, src) c89atomic_fetch_add_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_add_64(dst, src) c89atomic_fetch_add_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_fetch_sub_8( dst, src) c89atomic_fetch_sub_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_sub_8( dst, src) c89atomic_fetch_sub_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_sub_16(dst, src) c89atomic_fetch_sub_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_sub_16(dst, src) c89atomic_fetch_sub_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_sub_32(dst, src) c89atomic_fetch_sub_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_sub_32(dst, src) c89atomic_fetch_sub_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_sub_64(dst, src) c89atomic_fetch_sub_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_sub_64(dst, src) c89atomic_fetch_sub_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_fetch_or_8( dst, src) c89atomic_fetch_or_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_or_8( dst, src) c89atomic_fetch_or_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_or_16(dst, src) c89atomic_fetch_or_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_or_16(dst, src) c89atomic_fetch_or_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_or_32(dst, src) c89atomic_fetch_or_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_or_32(dst, src) c89atomic_fetch_or_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_or_64(dst, src) c89atomic_fetch_or_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_or_64(dst, src) c89atomic_fetch_or_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_fetch_xor_8( dst, src) c89atomic_fetch_xor_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_xor_8( dst, src) c89atomic_fetch_xor_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_xor_16(dst, src) c89atomic_fetch_xor_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_xor_16(dst, src) c89atomic_fetch_xor_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_xor_32(dst, src) c89atomic_fetch_xor_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_xor_32(dst, src) c89atomic_fetch_xor_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_xor_64(dst, src) c89atomic_fetch_xor_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_xor_64(dst, src) c89atomic_fetch_xor_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#define c89atomic_fetch_and_8( dst, src) c89atomic_fetch_and_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_and_8( dst, src) c89atomic_fetch_and_explicit_8 (dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_and_16(dst, src) c89atomic_fetch_and_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_and_16(dst, src) c89atomic_fetch_and_explicit_16(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_and_32(dst, src) c89atomic_fetch_and_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_and_32(dst, src) c89atomic_fetch_and_explicit_32(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
#define c89atomic_fetch_and_64(dst, src) c89atomic_fetch_and_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
#define c89atomic_fetch_and_64(dst, src) c89atomic_fetch_and_explicit_64(dst, src, c89atomic_memory_order_seq_cst)
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* c89atomic_h */
|
#endif
|
||||||
/* c89atomic.h end */
|
/* c89atomic.h end */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user