21 #include "../SDL_internal.h" 25 #if defined(_MSC_VER) && (_MSC_VER >= 1500) 27 #define HAVE_MSC_ATOMICS 1 30 #if defined(__MACOSX__) 31 #include <libkern/OSAtomic.h> 34 #if !defined(HAVE_GCC_ATOMICS) && defined(__SOLARIS__) 61 #if !defined(HAVE_MSC_ATOMICS) && !defined(HAVE_GCC_ATOMICS) && !defined(__MACOSX__) && !defined(__SOLARIS__) 89 #ifdef HAVE_MSC_ATOMICS 90 return (_InterlockedCompareExchange((
long*)&a->
value, (
long)newval, (
long)oldval) == (
long)oldval);
91 #elif defined(__MACOSX__) 92 return (
SDL_bool) OSAtomicCompareAndSwap32Barrier(oldval, newval, &a->
value);
93 #elif defined(HAVE_GCC_ATOMICS) 94 return (
SDL_bool) __sync_bool_compare_and_swap(&a->
value, oldval, newval);
95 #elif defined(__SOLARIS__) && defined(_LP64) 97 #elif defined(__SOLARIS__) && !defined(_LP64) 103 if (a->
value == oldval) {
111 #error Please define your platform. 118 #if defined(HAVE_MSC_ATOMICS) && (_M_IX86) 119 return (_InterlockedCompareExchange((
long*)a, (
long)newval, (
long)oldval) == (
long)oldval);
120 #elif defined(HAVE_MSC_ATOMICS) && (!_M_IX86) 121 return (_InterlockedCompareExchangePointer(a, newval, oldval) == oldval);
122 #elif defined(__MACOSX__) && defined(__LP64__) 124 #elif defined(__MACOSX__) && !defined(__LP64__) 126 #elif defined(HAVE_GCC_ATOMICS) 127 return __sync_bool_compare_and_swap(a, oldval, newval);
128 #elif defined(__SOLARIS__) 129 return (
SDL_bool) (atomic_cas_ptr(a, oldval, newval) == oldval);
142 #error Please define your platform. 149 #ifdef HAVE_MSC_ATOMICS 150 return _InterlockedExchange((
long*)&a->
value, v);
151 #elif defined(HAVE_GCC_ATOMICS) 152 return __sync_lock_test_and_set(&a->
value, v);
153 #elif defined(__SOLARIS__) && defined(_LP64) 155 #elif defined(__SOLARIS__) && !defined(_LP64) 169 #if defined(HAVE_MSC_ATOMICS) && (_M_IX86) 170 return (
void *) _InterlockedExchange((
long *)a, (
long) v);
171 #elif defined(HAVE_MSC_ATOMICS) && (!_M_IX86) 172 return _InterlockedExchangePointer(a, v);
173 #elif defined(HAVE_GCC_ATOMICS) 174 return __sync_lock_test_and_set(a, v);
175 #elif defined(__SOLARIS__) 176 return atomic_swap_ptr(a, v);
189 #ifdef HAVE_MSC_ATOMICS 190 return _InterlockedExchangeAdd((
long*)&a->
value, v);
191 #elif defined(HAVE_GCC_ATOMICS) 192 return __sync_fetch_and_add(&a->
value, v);
193 #elif defined(__SOLARIS__) 198 #elif !defined(_LP64) 232 #if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) 235 " .globl _SDL_MemoryBarrierRelease\n" 236 " .globl _SDL_MemoryBarrierAcquire\n" 237 "_SDL_MemoryBarrierRelease:\n" 238 "_SDL_MemoryBarrierAcquire:\n" 240 " mcr p15, 0, r0, c7, c10, 5\n" void * SDL_AtomicGetPtr(void **a)
Get the value of a pointer atomically.
A type representing an atomic integer value. It is a struct so people don't accidentally use numeric ...
unsigned long long uint64_t
int SDL_AtomicGet(SDL_atomic_t *a)
Get the value of an atomic variable.
SDL_bool SDL_AtomicCASPtr(void **a, void *oldval, void *newval)
Set a pointer to a new value if it is currently an old value.
GLsizei const GLfloat * value
void * SDL_AtomicSetPtr(void **a, void *v)
Set a pointer to a value atomically.
static SDL_INLINE void leaveLock(void *a)
int SDL_AtomicSet(SDL_atomic_t *a, int v)
Set an atomic variable to a value.
static SDL_INLINE void enterLock(void *a)
int SDL_AtomicAdd(SDL_atomic_t *a, int v)
Add to an atomic variable.
static SDL_SpinLock locks[32]
GLboolean GLboolean GLboolean GLboolean a
SDL_bool SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval)
Set an atomic variable to a new value if it is currently an old value.