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.