From a907d74903867fd47859d88d0042c74e1ca0e987 Mon Sep 17 00:00:00 2001 From: Palana Date: Sun, 3 May 2015 20:40:33 +0200 Subject: [PATCH] util: Add os_atomic_compare_swap_long --- libobs/util/threading-posix.c | 5 +++++ libobs/util/threading-windows.c | 5 +++++ libobs/util/threading.h | 3 +++ 3 files changed, 13 insertions(+) diff --git a/libobs/util/threading-posix.c b/libobs/util/threading-posix.c index a36010093..dcf6d2850 100644 --- a/libobs/util/threading-posix.c +++ b/libobs/util/threading-posix.c @@ -256,6 +256,11 @@ long os_atomic_dec_long(volatile long *val) return __sync_sub_and_fetch(val, 1); } +bool os_atomic_compare_swap_long(volatile long *val, long old_val, long new_val) +{ + return __sync_bool_compare_and_swap(val, old_val, new_val); +} + void os_set_thread_name(const char *name) { #if defined(__APPLE__) diff --git a/libobs/util/threading-windows.c b/libobs/util/threading-windows.c index e1df042c8..115d706f8 100644 --- a/libobs/util/threading-windows.c +++ b/libobs/util/threading-windows.c @@ -176,6 +176,11 @@ long os_atomic_dec_long(volatile long *val) return InterlockedDecrement(val); } +bool os_atomic_compare_swap_long(volatile long *val, long old_val, long new_val) +{ + return InterlockedCompareExchange(val, new_val, old_val) == old_val; +} + #define VC_EXCEPTION 0x406D1388 #pragma pack(push,8) diff --git a/libobs/util/threading.h b/libobs/util/threading.h index 749a541c3..5c4dacaf9 100644 --- a/libobs/util/threading.h +++ b/libobs/util/threading.h @@ -73,6 +73,9 @@ EXPORT int os_sem_wait(os_sem_t *sem); EXPORT long os_atomic_inc_long(volatile long *val); EXPORT long os_atomic_dec_long(volatile long *val); +EXPORT bool os_atomic_compare_swap_long(volatile long *val, + long old_val, long new_val); + EXPORT void os_set_thread_name(const char *name);