| 182 | } |
| 183 | |
| 184 | int32_t Atomic<int32_t>::exchange(int32_t desired, memory_order mem) |
| 185 | { |
| 186 | #if _MSC_VER |
| 187 | #if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) |
| 188 | switch (mem) |
| 189 | { |
| 190 | case memory_order_relaxed: return _InterlockedExchange_nf(reinterpret_cast<volatile long*>(&value), desired); |
| 191 | case memory_order_acquire: return _InterlockedExchange_acq(reinterpret_cast<volatile long*>(&value), desired); |
| 192 | case memory_order_release: return _InterlockedExchange_rel(reinterpret_cast<volatile long*>(&value), desired); |
| 193 | case memory_order_acq_rel: |
| 194 | case memory_order_seq_cst: |
| 195 | default: // consume is treated as acquire |
| 196 | return _InterlockedExchange(reinterpret_cast<volatile long*>(&value), desired); |
| 197 | } |
| 198 | #else |
| 199 | (void)mem; |
| 200 | return _InterlockedExchange(reinterpret_cast<volatile long*>(&value), desired); |
| 201 | #endif |
| 202 | #else |
| 203 | return __atomic_exchange_n(&value, desired, mem); |
| 204 | #endif |
| 205 | } |
| 206 | |
| 207 | bool Atomic<int32_t>::compare_exchange_weak(int32_t& expected, int32_t desired, memory_order success, |
| 208 | memory_order failure) |
no outgoing calls