diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index ce4796980..b70feae00 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -204,6 +204,7 @@ int32_t Dec32(volatile int32_t *i); int64_t Inc64(volatile int64_t *i); int64_t Dec64(volatile int64_t *i); int64_t ExchAdd64(volatile int64_t *i, int64_t a); +int32_t CmpExch32(volatile int32_t *dest, int32_t exch, int32_t comp); }; namespace Callstack diff --git a/renderdoc/os/posix/posix_threading.cpp b/renderdoc/os/posix/posix_threading.cpp index 08a7ab1d8..bc915391b 100644 --- a/renderdoc/os/posix/posix_threading.cpp +++ b/renderdoc/os/posix/posix_threading.cpp @@ -59,6 +59,11 @@ int64_t ExchAdd64(volatile int64_t *i, int64_t a) { return __sync_add_and_fetch(i, int64_t(a)); } + +int32_t CmpExch32(volatile int32_t *dest, int32_t exch, int32_t comp) +{ + return __sync_val_compare_and_swap(dest, comp, exch); +} }; namespace Threading diff --git a/renderdoc/os/win32/win32_threading.cpp b/renderdoc/os/win32/win32_threading.cpp index 5c86723ae..946be7192 100644 --- a/renderdoc/os/win32/win32_threading.cpp +++ b/renderdoc/os/win32/win32_threading.cpp @@ -72,6 +72,11 @@ int64_t ExchAdd64(volatile int64_t *i, int64_t a) { return (int64_t)InterlockedExchangeAdd64((volatile LONG64 *)i, a); } + +int32_t CmpExch32(volatile int32_t *dest, int32_t exch, int32_t comp) +{ + return (int32_t)InterlockedCompareExchange((volatile LONG *)dest, exch, comp); +} }; namespace Threading