diff --git a/platform/linux/threading/Atomic.h b/platform/linux/threading/Atomic.h index d4ec023..ff9cd24 100644 --- a/platform/linux/threading/Atomic.h +++ b/platform/linux/threading/Atomic.h @@ -24,6 +24,16 @@ void atomic_set(volatile int64* value, int64 new_value) __atomic_store_n(value, new_value, __ATOMIC_SEQ_CST); } +inline +int32 atomic_set_fetch(volatile int32* value, int32 new_value) { + return __atomic_exchange_n(value, new_value, __ATOMIC_SEQ_CST); +} + +inline +int64 atomic_set_fetch(volatile int64* value, int64 new_value) { + return __atomic_exchange_n(value, new_value, __ATOMIC_SEQ_CST); +} + inline void atomic_get(volatile byte* value, byte data[16]) { diff --git a/platform/linux/threading/Spinlock.h b/platform/linux/threading/Spinlock.h index ca1f706..488bb38 100644 --- a/platform/linux/threading/Spinlock.h +++ b/platform/linux/threading/Spinlock.h @@ -10,7 +10,6 @@ #define TOS_PLATFORM_LINUX_THREADING_SPINLOCK_H #include "../../../stdlib/Types.h" -#include "Spinlock.h" typedef volatile int32 spinlock32; diff --git a/platform/win32/threading/Atomic.h b/platform/win32/threading/Atomic.h index 72192af..32ab430 100644 --- a/platform/win32/threading/Atomic.h +++ b/platform/win32/threading/Atomic.h @@ -24,6 +24,18 @@ void atomic_set(volatile int64* value, int64 new_value) InterlockedExchange((long *) value, (long) new_value); } +inline +int32 atomic_set_fetch(volatile int32* value, int32 new_value) +{ + return (int32) InterlockedExchange((long *) value, new_value); +} + +inline +int64 atomic_set_fetch(volatile int64* value, int64 new_value) +{ + return (int64) InterlockedExchange((long *) value, (long) new_value); +} + inline void atomic_set(volatile byte* value, const byte new_value[16]) { diff --git a/platform/win32/threading/Spinlock.cpp b/platform/win32/threading/Spinlock.cpp index a0f0a20..ef82733 100644 --- a/platform/win32/threading/Spinlock.cpp +++ b/platform/win32/threading/Spinlock.cpp @@ -11,6 +11,7 @@ #include #include "../TimeUtils.h" +#include "Spinlock.h" inline void spinlock_start(spinlock32* lock, int32 delay = 10) {