Go to the documentation of this file. 22 #ifndef _ATOMIC_COMPAT_H_ 23 #define _ATOMIC_COMPAT_H_ 43 typedef unsigned int uint32_t;
45 #elif defined(ARM_CM4_FP) 47 #include <ARMCM4_FP.h> 51 #define ATOMIC_begin(expression, dest) \ 55 __lst_ = expression __LDREXW((uint32_t *)dest); 57 #define ATOMIC_end(dest) \ 59 while (__STREXW(__lst_, (uint32_t *)dest)) \ 66 #define FRAME_ADDRESS frame_address 68 #define OLD_FRAME_ADDRESS __old_value32 70 #define FRAME_ADDRESS_type std::atomic<uint32_t> 72 #define FRAME_ADDRESS_subtype uint32_t 74 #define ATOMIC_begin_VALUE64(dest) \ 76 uint32_t OLD_FRAME_ADDRESS = (uint32_t)std::atomic_load(&dest); \ 82 #define ATOMIC_end_VALUE64(new_value, dest) \ 84 while ((fail = !std::atomic_compare_exchange_strong( \ 85 &dest, &OLD_FRAME_ADDRESS, (uint32_t)new_value))) \ 88 #define ATOMIC_begin_VALUE64_NOEXCHANGE(dest) \ 89 uint32_t OLD_FRAME_ADDRESS = (uint32_t)std::atomic_load(&dest); \ 92 #define ATOMIC_end_VALUE64_NOEXCHANGE(dest) \ 94 while (!(std::atomic_load(&dest) == OLD_FRAME_ADDRESS)) \ 97 #define NATIVE_POINTER_TYPE uint32_t 98 #define NATIVE_ATOMIC_POINTER uint32_t 100 #elif defined(__x86__) || defined(__x86_64__) 106 #define FRAME_ADDRESS __counter 108 #define OLD_FRAME_ADDRESS __old_value64 110 #define FRAME_ADDRESS_type std::atomic<uint64_t> 112 #define FRAME_ADDRESS_subtype uint64_t 114 #define ATOMIC_begin_VALUE64(dest) \ 116 uint64_t OLD_FRAME_ADDRESS = (uint64_t)std::atomic_load(&dest); \ 122 #define ATOMIC_end_VALUE64(new_value, dest) \ 124 while ((fail = !std::atomic_compare_exchange_strong( \ 125 &dest, &OLD_FRAME_ADDRESS, (uint64_t)new_value))) \ 128 #define ATOMIC_begin_VALUE64_NOEXCHANGE(dest) \ 129 uint64_t OLD_FRAME_ADDRESS = (uint64_t)std::atomic_load(&dest); \ 132 #define ATOMIC_end_VALUE64_NOEXCHANGE(dest) \ 134 while (!(std::atomic_load(&dest) == OLD_FRAME_ADDRESS)) \ 137 #if defined(__x86_64__) 138 #define NATIVE_POINTER_TYPE uint64_t 139 typedef unsigned __int128 uint128_t;
140 #define NATIVE_ATOMIC_POINTER uint128_t 142 #define USE_DOUBLE_CAS 143 #define NATIVE_POINTER_TYPE uint32_t 144 #define NATIVE_ATOMIC_POINTER uint64_t 149 #warning "Atomic guarantees are not supported!" 151 #define ATOMIC_begin() 156 #endif //_ATOMIC_COMPAT_H_