21 #include "../SDL_internal.h"
23 #if defined(__WIN32__) || defined(__WINRT__)
24 #include "../core/windows/SDL_windows.h"
31 #if !defined(HAVE_GCC_ATOMICS) && defined(__SOLARIS__)
39 #if SDL_ATOMIC_DISABLED
43 if (!_spinlock_mutex) {
57 #elif defined(_MSC_VER)
59 return (InterlockedExchange((
long*)lock, 1) == 0);
61 #elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET
62 return (__sync_lock_test_and_set(lock, 1) == 0);
64 #elif defined(__GNUC__) && defined(__arm__) && \
65 (defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || \
66 defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5TE__) || \
67 defined(__ARM_ARCH_5TEJ__))
69 __asm__ __volatile__ (
71 :
"=&r,&r" (result) :
"r,0" (1),
"r,r" (lock) :
"memory");
74 #elif defined(__GNUC__) && defined(__arm__)
76 __asm__ __volatile__ (
77 "ldrex %0, [%2]\nteq %0, #0\nstrexeq %0, %1, [%2]"
78 :
"=&r" (result) :
"r" (1),
"r" (lock) :
"cc",
"memory");
81 #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
84 "lock ; xchgl %0, (%1)\n"
85 :
"=r" (result) :
"r" (lock),
"0" (1) :
"cc",
"memory");
88 #elif defined(__MACOSX__) || defined(__IPHONEOS__)
90 return OSAtomicCompareAndSwap32Barrier(0, 1, lock);
92 #elif defined(__SOLARIS__) && defined(_LP64)
96 #elif defined(__SOLARIS__) && !defined(_LP64)
101 #error Please implement for your platform.
118 #if defined(_MSC_VER)
122 #elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET
123 __sync_lock_release(lock);
125 #elif defined(__SOLARIS__)
void SDL_AtomicLock(SDL_SpinLock *lock)
Lock a spin lock by setting it to a non-zero value.
void SDL_AtomicUnlock(SDL_SpinLock *lock)
Unlock a spin lock by setting it to 0. Always returns immediately.
unsigned long long uint64_t
SDL_COMPILE_TIME_ASSERT(size, CountTo >0)
SDL_bool SDL_AtomicTryLock(SDL_SpinLock *lock)
Try to lock a spin lock by setting it to a non-zero value.