|
@@ -128,12 +128,13 @@ SDL_bool SDL_CompareAndSwapAtomicInt(SDL_AtomicInt *a, int oldval, int newval)
|
|
|
SDL_COMPILE_TIME_ASSERT(atomic_cas, sizeof(long) == sizeof(a->value));
|
|
|
return _InterlockedCompareExchange((long *)&a->value, (long)newval, (long)oldval) == (long)oldval;
|
|
|
#elif defined(HAVE_WATCOM_ATOMICS)
|
|
|
- return _SDL_cmpxchg_watcom(&a->value, newval, oldval);
|
|
|
+ return _SDL_cmpxchg_watcom((volatile int *)&a->value, newval, oldval);
|
|
|
#elif defined(HAVE_GCC_ATOMICS)
|
|
|
return __sync_bool_compare_and_swap(&a->value, oldval, newval);
|
|
|
#elif defined(SDL_PLATFORM_MACOS) // this is deprecated in 10.12 sdk; favor gcc atomics.
|
|
|
return OSAtomicCompareAndSwap32Barrier(oldval, newval, &a->value);
|
|
|
#elif defined(SDL_PLATFORM_SOLARIS)
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_cas, sizeof(uint_t) == sizeof(a->value));
|
|
|
return ((int)atomic_cas_uint((volatile uint_t *)&a->value, (uint_t)oldval, (uint_t)newval) == oldval);
|
|
|
#elif defined(EMULATE_CAS)
|
|
|
bool result = false;
|
|
@@ -151,6 +152,37 @@ SDL_bool SDL_CompareAndSwapAtomicInt(SDL_AtomicInt *a, int oldval, int newval)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+SDL_bool SDL_CompareAndSwapAtomicU32(SDL_AtomicU32 *a, Uint32 oldval, Uint32 newval)
|
|
|
+{
|
|
|
+#ifdef HAVE_MSC_ATOMICS
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_cas, sizeof(long) == sizeof(a->value));
|
|
|
+ return _InterlockedCompareExchange((long *)&a->value, (long)newval, (long)oldval) == (long)oldval;
|
|
|
+#elif defined(HAVE_WATCOM_ATOMICS)
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_cas, sizeof(int) == sizeof(a->value));
|
|
|
+ return _SDL_cmpxchg_watcom((volatile int *)&a->value, (int)newval, (int)oldval);
|
|
|
+#elif defined(HAVE_GCC_ATOMICS)
|
|
|
+ return __sync_bool_compare_and_swap(&a->value, oldval, newval);
|
|
|
+#elif defined(SDL_PLATFORM_MACOS) // this is deprecated in 10.12 sdk; favor gcc atomics.
|
|
|
+ return OSAtomicCompareAndSwap32Barrier((int32_t)oldval, (int32_t)newval, (int32_t*)&a->value);
|
|
|
+#elif defined(SDL_PLATFORM_SOLARIS)
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_cas, sizeof(uint_t) == sizeof(a->value));
|
|
|
+ return ((Uint32)atomic_cas_uint((volatile uint_t *)&a->value, (uint_t)oldval, (uint_t)newval) == oldval);
|
|
|
+#elif defined(EMULATE_CAS)
|
|
|
+ bool result = false;
|
|
|
+
|
|
|
+ enterLock(a);
|
|
|
+ if (a->value == oldval) {
|
|
|
+ a->value = newval;
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ leaveLock(a);
|
|
|
+
|
|
|
+ return result;
|
|
|
+#else
|
|
|
+#error Please define your platform.
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
SDL_bool SDL_CompareAndSwapAtomicPointer(void **a, void *oldval, void *newval)
|
|
|
{
|
|
|
#ifdef HAVE_MSC_ATOMICS
|
|
@@ -191,6 +223,7 @@ int SDL_SetAtomicInt(SDL_AtomicInt *a, int v)
|
|
|
#elif defined(HAVE_GCC_ATOMICS)
|
|
|
return __sync_lock_test_and_set(&a->value, v);
|
|
|
#elif defined(SDL_PLATFORM_SOLARIS)
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_set, sizeof(uint_t) == sizeof(a->value));
|
|
|
return (int)atomic_swap_uint((volatile uint_t *)&a->value, v);
|
|
|
#else
|
|
|
int value;
|
|
@@ -201,6 +234,27 @@ int SDL_SetAtomicInt(SDL_AtomicInt *a, int v)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+Uint32 SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 v)
|
|
|
+{
|
|
|
+#ifdef HAVE_MSC_ATOMICS
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_set, sizeof(long) == sizeof(a->value));
|
|
|
+ return _InterlockedExchange((long *)&a->value, v);
|
|
|
+#elif defined(HAVE_WATCOM_ATOMICS)
|
|
|
+ return _SDL_xchg_watcom(&a->value, v);
|
|
|
+#elif defined(HAVE_GCC_ATOMICS)
|
|
|
+ return __sync_lock_test_and_set(&a->value, v);
|
|
|
+#elif defined(SDL_PLATFORM_SOLARIS)
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_set, sizeof(uint_t) == sizeof(a->value));
|
|
|
+ return (Uint32)atomic_swap_uint((volatile uint_t *)&a->value, v);
|
|
|
+#else
|
|
|
+ Uint32 value;
|
|
|
+ do {
|
|
|
+ value = a->value;
|
|
|
+ } while (!SDL_CompareAndSwapAtomicU32(a, value, v));
|
|
|
+ return value;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
void *SDL_SetAtomicPointer(void **a, void *v)
|
|
|
{
|
|
|
#ifdef HAVE_MSC_ATOMICS
|
|
@@ -226,7 +280,8 @@ int SDL_AddAtomicInt(SDL_AtomicInt *a, int v)
|
|
|
SDL_COMPILE_TIME_ASSERT(atomic_add, sizeof(long) == sizeof(a->value));
|
|
|
return _InterlockedExchangeAdd((long *)&a->value, v);
|
|
|
#elif defined(HAVE_WATCOM_ATOMICS)
|
|
|
- return _SDL_xadd_watcom(&a->value, v);
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_add, sizeof(int) == sizeof(a->value));
|
|
|
+ return _SDL_xadd_watcom((volatile int *)&a->value, v);
|
|
|
#elif defined(HAVE_GCC_ATOMICS)
|
|
|
return __sync_fetch_and_add(&a->value, v);
|
|
|
#elif defined(SDL_PLATFORM_SOLARIS)
|
|
@@ -267,6 +322,32 @@ int SDL_GetAtomicInt(SDL_AtomicInt *a)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+Uint32 SDL_GetAtomicU32(SDL_AtomicU32 *a)
|
|
|
+{
|
|
|
+#ifdef HAVE_ATOMIC_LOAD_N
|
|
|
+ return __atomic_load_n(&a->value, __ATOMIC_SEQ_CST);
|
|
|
+#elif defined(HAVE_MSC_ATOMICS)
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_get, sizeof(long) == sizeof(a->value));
|
|
|
+ return (Uint32)_InterlockedOr((long *)&a->value, 0);
|
|
|
+#elif defined(HAVE_WATCOM_ATOMICS)
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_get, sizeof(int) == sizeof(a->value));
|
|
|
+ return (Uint32)_SDL_xadd_watcom((volatile int *)&a->value, 0);
|
|
|
+#elif defined(HAVE_GCC_ATOMICS)
|
|
|
+ return __sync_or_and_fetch(&a->value, 0);
|
|
|
+#elif defined(SDL_PLATFORM_MACOS) // this is deprecated in 10.12 sdk; favor gcc atomics.
|
|
|
+ return OSAtomicOr32Barrier(0, (volatile uint32_t *)&a->value);
|
|
|
+#elif defined(SDL_PLATFORM_SOLARIS)
|
|
|
+ SDL_COMPILE_TIME_ASSERT(atomic_get, sizeof(uint_t) == sizeof(a->value));
|
|
|
+ return (Uint32)atomic_or_uint_nv((volatile uint_t *)&a->value, 0);
|
|
|
+#else
|
|
|
+ Uint32 value;
|
|
|
+ do {
|
|
|
+ value = a->value;
|
|
|
+ } while (!SDL_CompareAndSwapAtomicU32(a, value, value));
|
|
|
+ return value;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
void *SDL_GetAtomicPointer(void **a)
|
|
|
{
|
|
|
#ifdef HAVE_ATOMIC_LOAD_N
|