Browse Source

util: Add os_atomic_compare_swap_long

Palana 11 years ago
parent
commit
a907d74903
3 changed files with 13 additions and 0 deletions
  1. 5 0
      libobs/util/threading-posix.c
  2. 5 0
      libobs/util/threading-windows.c
  3. 3 0
      libobs/util/threading.h

+ 5 - 0
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__)

+ 5 - 0
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)

+ 3 - 0
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);