28#if (!defined AAX_PointerSize)
29#error Undefined pointer size
41 volatile uint32_t& ioValue,
42 uint32_t inExchangeValue);
46 volatile uint64_t& ioValue,
47 uint64_t inExchangeValue);
52#if (AAX_PointerSize == AAXPointer_64bit)
54#elif (AAX_PointerSize == AAXPointer_32bit)
57#error Unsupported pointer size
63 volatile uint32_t & ioValue,
64 uint32_t inCompareValue,
65 uint32_t inExchangeValue);
69 volatile uint64_t& ioValue,
70 uint64_t inCompareValue,
71 uint64_t inExchangeValue);
76#if (AAX_PointerSize == AAXPointer_64bit)
78#elif (AAX_PointerSize == AAXPointer_32bit)
81#error Unsupported pointer size
97#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
102 return __sync_add_and_fetch(&ioData, 1);
108 return __sync_sub_and_fetch(&ioData, 1);
113 volatile uint32_t& ioValue,
114 uint32_t inExchangeValue)
116 return __sync_lock_test_and_set(&ioValue, inExchangeValue);
121 volatile uint64_t& ioValue,
122 uint64_t inExchangeValue)
124 return __sync_lock_test_and_set(&ioValue, inExchangeValue);
129 volatile uint32_t & ioValue,
130 uint32_t inCompareValue,
131 uint32_t inExchangeValue)
133 return __sync_bool_compare_and_swap(&ioValue, inCompareValue, inExchangeValue);
138 volatile uint64_t& ioValue,
139 uint64_t inCompareValue,
140 uint64_t inExchangeValue)
142 return __sync_bool_compare_and_swap(&ioValue, inCompareValue, inExchangeValue);
146template<
typename TPo
inter>
151 __atomic_load(
const_cast<TPointer *
volatile *
>(inValue), &(value), __ATOMIC_ACQUIRE);
156#error This file requires GCC 4.2 or later
165#elif defined(_MSC_VER)
171#pragma intrinsic( _InterlockedIncrement, \
172 _InterlockedDecrement, \
173 _InterlockedExchange, \
174 _InterlockedCompareExchange, \
175 _InterlockedCompareExchange64)
180 return static_cast<uint32_t
>(_InterlockedIncrement((
volatile long*)&ioData));
186 return static_cast<uint32_t
>(_InterlockedDecrement((
volatile long*)&ioData));
191 volatile uint32_t& ioDestination,
192 uint32_t inExchangeValue)
194 return static_cast<uint32_t
>(_InterlockedExchange((
volatile long*)&ioDestination, (
long)inExchangeValue));
197#if (AAX_PointerSize == AAXPointer_64bit)
199#pragma intrinsic( _InterlockedExchange64, \
204 volatile uint64_t& ioValue,
205 uint64_t inExchangeValue)
207 return static_cast<uint64_t
>(_InterlockedExchange64((
volatile __int64*)&ioValue, (__int64)inExchangeValue));
210template<
typename TPo
inter>
216 return reinterpret_cast<TPointer*
>(_InterlockedOr64_acq(
const_cast<__int64
volatile *
>(
reinterpret_cast<const __int64
volatile *
>(inValue)), 0x0000000000000000));
218 return reinterpret_cast<TPointer*
>(_InterlockedOr64(
const_cast<__int64
volatile *
>(
reinterpret_cast<const __int64
volatile *
>(inValue)), 0x0000000000000000));
222#elif (AAX_PointerSize == AAXPointer_32bit)
224#pragma intrinsic( _InterlockedOr )
229 volatile uint64_t& ioValue,
230 uint64_t inExchangeValue)
234 uint64_t result = ioValue;
244template<
typename TPo
inter>
248 return reinterpret_cast<TPointer*
>(_InterlockedOr(
const_cast<long volatile *
>(
reinterpret_cast<const long volatile *
>(inValue)), 0x00000000));
255 uint32_t
volatile & ioValue,
256 uint32_t inCompareValue,
257 uint32_t inExchangeValue)
259 return static_cast<uint32_t
>(_InterlockedCompareExchange((
volatile long*)&ioValue, (
long)inExchangeValue, (
long)inCompareValue)) == inCompareValue;
264 volatile uint64_t& ioValue,
265 uint64_t inCompareValue,
266 uint64_t inExchangeValue)
268 return static_cast<uint64_t
>(_InterlockedCompareExchange64((
volatile __int64*)&ioValue, (__int64)inExchangeValue, (__int64)inCompareValue)) == inCompareValue;
278#error Provide an atomic operation implementation for this compiler
Various utility definitions for AAX.
#define AAX_CALLBACK
Definition: AAX.h:282
uint64_t AAX_CALLBACK AAX_Atomic_Exchange_64(volatile uint64_t &ioValue, uint64_t inExchangeValue)
Return the original value of ioValue and then set it to inExchangeValue.
uint32_t AAX_CALLBACK AAX_Atomic_Exchange_32(volatile uint32_t &ioValue, uint32_t inExchangeValue)
Return the original value of ioValue and then set it to inExchangeValue.
uint32_t AAX_CALLBACK AAX_Atomic_IncThenGet_32(uint32_t &ioData)
Increments a 32-bit value and returns the result.
bool AAX_CALLBACK AAX_Atomic_CompareAndExchange_32(volatile uint32_t &ioValue, uint32_t inCompareValue, uint32_t inExchangeValue)
Perform a compare and exchange operation on a 32-bit value.
bool AAX_CALLBACK AAX_Atomic_CompareAndExchange_Pointer(TPointer *&ioValue, TPointer *inCompareValue, TPointer *inExchangeValue)
Perform a compare and exchange operation on a pointer value.
Definition: AAX_Atomic.h:74
TPointer *AAX_CALLBACK AAX_Atomic_Load_Pointer(TPointer const *const volatile *inValue)
Atomically loads a pointer value.
uint32_t AAX_CALLBACK AAX_Atomic_DecThenGet_32(uint32_t &ioData)
Decrements a 32-bit value and returns the result.
TPointer *AAX_CALLBACK AAX_Atomic_Exchange_Pointer(TPointer *&ioValue, TPointer *inExchangeValue)
Perform an exchange operation on a pointer value.
Definition: AAX_Atomic.h:50
bool AAX_CALLBACK AAX_Atomic_CompareAndExchange_64(volatile uint64_t &ioValue, uint64_t inCompareValue, uint64_t inExchangeValue)
Perform a compare and exchange operation on a 64-bit value.