// Native runtime - Atomic operations // Part of the AC6 Recompilation native foundation #pragma once #include namespace rex::thread { int32_t atomic_inc(volatile int32_t* value); int32_t atomic_dec(volatile int32_t* value); int32_t atomic_exchange(int32_t new_value, volatile int32_t* value); int64_t atomic_exchange(int64_t new_value, volatile int64_t* value); int32_t atomic_exchange_add(int32_t amount, volatile int32_t* value); int64_t atomic_exchange_add(int64_t amount, volatile int64_t* value); bool atomic_cas(int32_t old_value, int32_t new_value, volatile int32_t* value); bool atomic_cas(int64_t old_value, int64_t new_value, volatile int64_t* value); void atomic_store_release(int32_t new_value, volatile int32_t* value); inline uint32_t atomic_inc(volatile uint32_t* value) { return static_cast(atomic_inc(reinterpret_cast(value))); } inline uint32_t atomic_dec(volatile uint32_t* value) { return static_cast(atomic_dec(reinterpret_cast(value))); } inline uint32_t atomic_exchange(uint32_t new_value, volatile uint32_t* value) { return static_cast( atomic_exchange(static_cast(new_value), reinterpret_cast(value))); } inline uint64_t atomic_exchange(uint64_t new_value, volatile uint64_t* value) { return static_cast( atomic_exchange(static_cast(new_value), reinterpret_cast(value))); } inline uint32_t atomic_exchange_add(uint32_t amount, volatile uint32_t* value) { return static_cast(atomic_exchange_add(static_cast(amount), reinterpret_cast(value))); } inline uint64_t atomic_exchange_add(uint64_t amount, volatile uint64_t* value) { return static_cast(atomic_exchange_add(static_cast(amount), reinterpret_cast(value))); } inline bool atomic_cas(uint32_t old_value, uint32_t new_value, volatile uint32_t* value) { return atomic_cas(static_cast(old_value), static_cast(new_value), reinterpret_cast(value)); } inline bool atomic_cas(uint64_t old_value, uint64_t new_value, volatile uint64_t* value) { return atomic_cas(static_cast(old_value), static_cast(new_value), reinterpret_cast(value)); } inline void atomic_store_release(uint32_t new_value, volatile uint32_t* value) { atomic_store_release(static_cast(new_value), reinterpret_cast(value)); } } // namespace rex::thread