From 4543cd168df4fe0c668fbbe2f252ccb060d15485 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 25 Dec 2015 00:50:33 -0800 Subject: [PATCH] libobs/util: Add long load/store atomic funcs --- libobs/util/threading-posix.c | 10 ++++++++++ libobs/util/threading-windows.c | 10 ++++++++++ libobs/util/threading.h | 2 ++ 3 files changed, 22 insertions(+) diff --git a/libobs/util/threading-posix.c b/libobs/util/threading-posix.c index 3afa4c14e..92672d638 100644 --- a/libobs/util/threading-posix.c +++ b/libobs/util/threading-posix.c @@ -256,6 +256,16 @@ long os_atomic_dec_long(volatile long *val) return __sync_sub_and_fetch(val, 1); } +long os_atomic_set_long(volatile long *ptr, long val) +{ + return __sync_lock_test_and_set(ptr, val); +} + +long os_atomic_load_long(const volatile long *ptr) +{ + return __atomic_load_n(ptr, __ATOMIC_SEQ_CST); +} + 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); diff --git a/libobs/util/threading-windows.c b/libobs/util/threading-windows.c index c73357ec7..193749dd1 100644 --- a/libobs/util/threading-windows.c +++ b/libobs/util/threading-windows.c @@ -159,6 +159,16 @@ long os_atomic_dec_long(volatile long *val) return InterlockedDecrement(val); } +long os_atomic_set_long(volatile long *ptr, long val) +{ + return (long)InterlockedExchange((volatile long*)ptr, (long)val); +} + +long os_atomic_load_long(const volatile long *ptr) +{ + return (long)InterlockedOr((volatile long*)ptr, 0); +} + bool os_atomic_compare_swap_long(volatile long *val, long old_val, long new_val) { return InterlockedCompareExchange(val, new_val, old_val) == old_val; diff --git a/libobs/util/threading.h b/libobs/util/threading.h index 41791b8c8..f7d0277b4 100644 --- a/libobs/util/threading.h +++ b/libobs/util/threading.h @@ -72,6 +72,8 @@ 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 long os_atomic_set_long(volatile long *ptr, long val); +EXPORT long os_atomic_load_long(const volatile long *ptr); EXPORT bool os_atomic_compare_swap_long(volatile long *val, long old_val, long new_val);