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__) 39 #if defined(HAVE_GCC_ATOMICS) 40 # if defined(__clang__) 41 # if __has_builtin(__atomic_load_n) 44 # if !defined(__ANDROID__) 45 # define HAVE_ATOMIC_LOAD_N 1 48 # elif defined(__GNUC__) 50 # define HAVE_ATOMIC_LOAD_N 1 55 #if defined(__WATCOMC__) && defined(__386__) 56 #define HAVE_WATCOM_ATOMICS 57 extern _inline
int _SDL_xchg_watcom(
volatile int *
a,
int v);
58 #pragma aux _SDL_xchg_watcom = \ 64 extern _inline
unsigned char _SDL_cmpxchg_watcom(
volatile int *
a,
int newval,
int oldval);
65 #pragma aux _SDL_cmpxchg_watcom = \ 66 "lock cmpxchg [edx], ecx" \ 68 parm [edx] [ecx] [eax] \ 72 extern _inline
int _SDL_xadd_watcom(
volatile int *
a,
int v);
73 #pragma aux _SDL_xadd_watcom = \ 74 "lock xadd [ecx], eax" \ 103 #if !defined(HAVE_MSC_ATOMICS) && !defined(HAVE_GCC_ATOMICS) && !defined(__MACOSX__) && !defined(__SOLARIS__) && !defined(HAVE_WATCOM_ATOMICS) 104 #define EMULATE_CAS 1 131 #ifdef HAVE_MSC_ATOMICS 132 return (_InterlockedCompareExchange((
long*)&a->
value, (
long)newval, (
long)oldval) == (
long)oldval);
133 #elif defined(HAVE_WATCOM_ATOMICS) 134 return (
SDL_bool) _SDL_cmpxchg_watcom(&a->
value, newval, oldval);
135 #elif defined(HAVE_GCC_ATOMICS) 136 return (
SDL_bool) __sync_bool_compare_and_swap(&a->
value, oldval, newval);
137 #elif defined(__MACOSX__) 138 return (
SDL_bool) OSAtomicCompareAndSwap32Barrier(oldval, newval, &a->
value);
139 #elif defined(__SOLARIS__) && defined(_LP64) 141 #elif defined(__SOLARIS__) && !defined(_LP64) 147 if (a->
value == oldval) {
155 #error Please define your platform. 162 #if defined(HAVE_MSC_ATOMICS) && (_M_IX86) 163 return (_InterlockedCompareExchange((
long*)a, (
long)newval, (
long)oldval) == (
long)oldval);
164 #elif defined(HAVE_MSC_ATOMICS) && (!_M_IX86) 165 return (_InterlockedCompareExchangePointer(a, newval, oldval) == oldval);
166 #elif defined(HAVE_WATCOM_ATOMICS) 167 return (
SDL_bool) _SDL_cmpxchg_watcom((
int *)a, (
long)newval, (
long)oldval);
168 #elif defined(HAVE_GCC_ATOMICS) 169 return __sync_bool_compare_and_swap(a, oldval, newval);
170 #elif defined(__MACOSX__) && defined(__LP64__) 172 #elif defined(__MACOSX__) && !defined(__LP64__) 174 #elif defined(__SOLARIS__) 175 return (
SDL_bool) (atomic_cas_ptr(a, oldval, newval) == oldval);
188 #error Please define your platform. 195 #ifdef HAVE_MSC_ATOMICS 196 return _InterlockedExchange((
long*)&a->
value, v);
197 #elif defined(HAVE_WATCOM_ATOMICS) 198 return _SDL_xchg_watcom(&a->
value, v);
199 #elif defined(HAVE_GCC_ATOMICS) 200 return __sync_lock_test_and_set(&a->
value, v);
201 #elif defined(__SOLARIS__) && defined(_LP64) 203 #elif defined(__SOLARIS__) && !defined(_LP64) 217 #if defined(HAVE_MSC_ATOMICS) && (_M_IX86) 218 return (
void *) _InterlockedExchange((
long *)a, (
long) v);
219 #elif defined(HAVE_MSC_ATOMICS) && (!_M_IX86) 220 return _InterlockedExchangePointer(a, v);
221 #elif defined(HAVE_WATCOM_ATOMICS) 222 return (
void *) _SDL_xchg_watcom((
int *)a, (
long)v);
223 #elif defined(HAVE_GCC_ATOMICS) 224 return __sync_lock_test_and_set(a, v);
225 #elif defined(__SOLARIS__) 226 return atomic_swap_ptr(a, v);
239 #ifdef HAVE_MSC_ATOMICS 240 return _InterlockedExchangeAdd((
long*)&a->
value, v);
241 #elif defined(HAVE_WATCOM_ATOMICS) 242 return _SDL_xadd_watcom(&a->
value, v);
243 #elif defined(HAVE_GCC_ATOMICS) 244 return __sync_fetch_and_add(&a->
value, v);
245 #elif defined(__SOLARIS__) 250 #elif !defined(_LP64) 266 #ifdef HAVE_ATOMIC_LOAD_N 267 return __atomic_load_n(&a->
value, __ATOMIC_SEQ_CST);
280 #ifdef HAVE_ATOMIC_LOAD_N 281 return __atomic_load_n(a, __ATOMIC_SEQ_CST);
void * SDL_AtomicGetPtr(void **a)
Get the value of a pointer atomically.
#define SDL_MemoryBarrierRelease()
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.
#define SDL_MemoryBarrierAcquire()
void * SDL_AtomicSetPtr(void **a, void *v)
Set a pointer to a value atomically.
GLsizei const GLfloat * value
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]
void SDL_MemoryBarrierAcquireFunction(void)
GLboolean GLboolean GLboolean GLboolean a
void SDL_MemoryBarrierReleaseFunction(void)
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.