25 #ifndef _AAX_ATOMIC_H_
26 #define _AAX_ATOMIC_H_
31 #if (!defined AAX_PointerSize)
32 #error Undefined pointer size
44 volatile uint32_t& ioValue,
45 uint32_t inExchangeValue);
49 volatile uint64_t& ioValue,
50 uint64_t inExchangeValue);
55 #if (AAX_PointerSize == AAXPointer_64bit)
57 #elif (AAX_PointerSize == AAXPointer_32bit)
60 #error Unsupported pointer size
66 volatile uint32_t & ioValue,
67 uint32_t inCompareValue,
68 uint32_t inExchangeValue);
72 volatile uint64_t& ioValue,
73 uint64_t inCompareValue,
74 uint64_t inExchangeValue);
79 #if (AAX_PointerSize == AAXPointer_64bit)
81 #elif (AAX_PointerSize == AAXPointer_32bit)
84 #error Unsupported pointer size
100 #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
105 return __sync_add_and_fetch(&ioData, 1);
111 return __sync_sub_and_fetch(&ioData, 1);
116 volatile uint32_t& ioValue,
117 uint32_t inExchangeValue)
119 return __sync_lock_test_and_set(&ioValue, inExchangeValue);
124 volatile uint64_t& ioValue,
125 uint64_t inExchangeValue)
127 return __sync_lock_test_and_set(&ioValue, inExchangeValue);
132 volatile uint32_t & ioValue,
133 uint32_t inCompareValue,
134 uint32_t inExchangeValue)
136 return __sync_bool_compare_and_swap(&ioValue, inCompareValue, inExchangeValue);
141 volatile uint64_t& ioValue,
142 uint64_t inCompareValue,
143 uint64_t inExchangeValue)
145 return __sync_bool_compare_and_swap(&ioValue, inCompareValue, inExchangeValue);
149 template<
typename TPo
inter>
154 __atomic_load(
const_cast<TPointer *
volatile *
>(inValue), &(value), __ATOMIC_ACQUIRE);
159 #error This file requires GCC 4.2 or later
168 #elif defined(_MSC_VER)
174 #pragma intrinsic( _InterlockedIncrement, \
175 _InterlockedDecrement, \
176 _InterlockedExchange, \
177 _InterlockedCompareExchange, \
178 _InterlockedCompareExchange64)
183 return static_cast<uint32_t
>(_InterlockedIncrement((
volatile long*)&ioData));
189 return static_cast<uint32_t
>(_InterlockedDecrement((
volatile long*)&ioData));
194 volatile uint32_t& ioDestination,
195 uint32_t inExchangeValue)
197 return static_cast<uint32_t
>(_InterlockedExchange((
volatile long*)&ioDestination, (
long)inExchangeValue));
200 #if (AAX_PointerSize == AAXPointer_64bit)
202 #pragma intrinsic( _InterlockedExchange64, \
207 volatile uint64_t& ioValue,
208 uint64_t inExchangeValue)
210 return static_cast<uint64_t
>(_InterlockedExchange64((
volatile __int64*)&ioValue, (__int64)inExchangeValue));
213 template<
typename TPo
inter>
219 return reinterpret_cast<TPointer*
>(_InterlockedOr64_acq(
const_cast<__int64
volatile *
>(
reinterpret_cast<const __int64
volatile *
>(inValue)), 0x0000000000000000));
221 return reinterpret_cast<TPointer*
>(_InterlockedOr64(
const_cast<__int64
volatile *
>(
reinterpret_cast<const __int64
volatile *
>(inValue)), 0x0000000000000000));
225 #elif (AAX_PointerSize == AAXPointer_32bit)
227 #pragma intrinsic( _InterlockedOr )
232 volatile uint64_t& ioValue,
233 uint64_t inExchangeValue)
237 uint64_t result = ioValue;
247 template<
typename TPo
inter>
251 return reinterpret_cast<TPointer*
>(_InterlockedOr(
const_cast<long volatile *
>(
reinterpret_cast<const long volatile *
>(inValue)), 0x00000000));
258 uint32_t
volatile & ioValue,
259 uint32_t inCompareValue,
260 uint32_t inExchangeValue)
262 return static_cast<uint32_t
>(_InterlockedCompareExchange((
volatile long*)&ioValue, (
long)inExchangeValue, (
long)inCompareValue)) == inCompareValue;
267 volatile uint64_t& ioValue,
268 uint64_t inCompareValue,
269 uint64_t inExchangeValue)
271 return static_cast<uint64_t
>(_InterlockedCompareExchange64((
volatile __int64*)&ioValue, (__int64)inExchangeValue, (__int64)inCompareValue)) == inCompareValue;
281 #error Provide an atomic operation implementation for this compiler
Various utility definitions for AAX.
#define AAX_CALLBACK
Definition: AAX.h:285
TPointer *AAX_CALLBACK AAX_Atomic_Exchange_Pointer(TPointer *&ioValue, TPointer *inExchangeValue)
Perform an exchange operation on a pointer value.
Definition: AAX_Atomic.h:53
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:77
uint32_t AAX_CALLBACK AAX_Atomic_DecThenGet_32(uint32_t &ioData)
Decrements a 32-bit value and returns the result.
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.
TPointer *AAX_CALLBACK AAX_Atomic_Load_Pointer(TPointer const *const volatile *inValue)
Atomically loads a pointer value.