41#if (!defined AAX_PointerSize)
42#error Undefined pointer size
54 volatile uint32_t& ioValue,
55 uint32_t inExchangeValue);
59 volatile uint64_t& ioValue,
60 uint64_t inExchangeValue);
65#if (AAX_PointerSize == AAXPointer_64bit)
67#elif (AAX_PointerSize == AAXPointer_32bit)
70#error Unsupported pointer size
76 volatile uint32_t & ioValue,
77 uint32_t inCompareValue,
78 uint32_t inExchangeValue);
82 volatile uint64_t& ioValue,
83 uint64_t inCompareValue,
84 uint64_t inExchangeValue);
89#if (AAX_PointerSize == AAXPointer_64bit)
91#elif (AAX_PointerSize == AAXPointer_32bit)
94#error Unsupported pointer size
110#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
115 return __sync_add_and_fetch(&ioData, 1);
121 return __sync_sub_and_fetch(&ioData, 1);
126 volatile uint32_t& ioValue,
127 uint32_t inExchangeValue)
129 return __sync_lock_test_and_set(&ioValue, inExchangeValue);
134 volatile uint64_t& ioValue,
135 uint64_t inExchangeValue)
137 return __sync_lock_test_and_set(&ioValue, inExchangeValue);
142 volatile uint32_t & ioValue,
143 uint32_t inCompareValue,
144 uint32_t inExchangeValue)
146 return __sync_bool_compare_and_swap(&ioValue, inCompareValue, inExchangeValue);
151 volatile uint64_t& ioValue,
152 uint64_t inCompareValue,
153 uint64_t inExchangeValue)
155 return __sync_bool_compare_and_swap(&ioValue, inCompareValue, inExchangeValue);
159template<
typename TPo
inter>
164 __atomic_load(
const_cast<TPointer *
volatile *
>(inValue), &(value), __ATOMIC_ACQUIRE);
169#error This file requires GCC 4.2 or later
178#elif defined(_MSC_VER)
184#pragma intrinsic( _InterlockedIncrement, \
185 _InterlockedDecrement, \
186 _InterlockedExchange, \
187 _InterlockedCompareExchange, \
188 _InterlockedCompareExchange64)
193 return static_cast<uint32_t
>(_InterlockedIncrement((
volatile long*)&ioData));
199 return static_cast<uint32_t
>(_InterlockedDecrement((
volatile long*)&ioData));
204 volatile uint32_t& ioDestination,
205 uint32_t inExchangeValue)
207 return static_cast<uint32_t
>(_InterlockedExchange((
volatile long*)&ioDestination, (
long)inExchangeValue));
210#if (AAX_PointerSize == AAXPointer_64bit)
212#pragma intrinsic( _InterlockedExchange64, \
217 volatile uint64_t& ioValue,
218 uint64_t inExchangeValue)
220 return static_cast<uint64_t
>(_InterlockedExchange64((
volatile __int64*)&ioValue, (__int64)inExchangeValue));
223template<
typename TPo
inter>
229 return reinterpret_cast<TPointer*
>(_InterlockedOr64_acq(
const_cast<__int64
volatile *
>(
reinterpret_cast<const __int64
volatile *
>(inValue)), 0x0000000000000000));
231 return reinterpret_cast<TPointer*
>(_InterlockedOr64(
const_cast<__int64
volatile *
>(
reinterpret_cast<const __int64
volatile *
>(inValue)), 0x0000000000000000));
235#elif (AAX_PointerSize == AAXPointer_32bit)
237#pragma intrinsic( _InterlockedOr )
242 volatile uint64_t& ioValue,
243 uint64_t inExchangeValue)
247 uint64_t result = ioValue;
257template<
typename TPo
inter>
261 return reinterpret_cast<TPointer*
>(_InterlockedOr(
const_cast<long volatile *
>(
reinterpret_cast<const long volatile *
>(inValue)), 0x00000000));
268 uint32_t
volatile & ioValue,
269 uint32_t inCompareValue,
270 uint32_t inExchangeValue)
272 return static_cast<uint32_t
>(_InterlockedCompareExchange((
volatile long*)&ioValue, (
long)inExchangeValue, (
long)inCompareValue)) == inCompareValue;
277 volatile uint64_t& ioValue,
278 uint64_t inCompareValue,
279 uint64_t inExchangeValue)
281 return static_cast<uint64_t
>(_InterlockedCompareExchange64((
volatile __int64*)&ioValue, (__int64)inExchangeValue, (__int64)inCompareValue)) == inCompareValue;
291#error Provide an atomic operation implementation for this compiler
Various utility definitions for AAX.
#define AAX_CALLBACK
Definition: AAX.h:295
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:87
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:63
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.