Go to the documentation of this file.
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__)
35 #if !defined(HAVE_GCC_ATOMICS) && defined(__RISCOS__)
36 #include <unixlib/local.h>
39 #if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
40 #include <xmmintrin.h>
43 #if defined(__WATCOMC__) && defined(__386__)
45 extern _inline
int _SDL_xchg_watcom(
volatile int *
a,
int v);
46 #pragma aux _SDL_xchg_watcom = \
47 "lock xchg [ecx], eax" \
57 #if SDL_ATOMIC_DISABLED
61 if (!_spinlock_mutex) {
75 #elif defined(_MSC_VER)
77 return (InterlockedExchange((
long*)
lock, 1) == 0);
79 #elif defined(__WATCOMC__) && defined(__386__)
80 return _SDL_xchg_watcom(
lock, 1) == 0;
82 #elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET
83 return (__sync_lock_test_and_set(
lock, 1) == 0);
85 #elif defined(__GNUC__) && defined(__arm__) && \
86 (defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) || \
87 defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || \
88 defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5TE__) || \
89 defined(__ARM_ARCH_5TEJ__))
92 #if defined(__RISCOS__)
93 if (__cpucap_have_rex()) {
94 __asm__ __volatile__ (
95 "ldrex %0, [%2]\nteq %0, #0\nstrexeq %0, %1, [%2]"
96 :
"=&r" (
result) :
"r" (1),
"r" (
lock) :
"cc",
"memory");
101 __asm__ __volatile__ (
103 :
"=&r,&r" (
result) :
"r,0" (1),
"r,r" (
lock) :
"memory");
106 #elif defined(__GNUC__) && defined(__arm__)
108 __asm__ __volatile__ (
109 "ldrex %0, [%2]\nteq %0, #0\nstrexeq %0, %1, [%2]"
110 :
"=&r" (
result) :
"r" (1),
"r" (
lock) :
"cc",
"memory");
113 #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
115 __asm__ __volatile__(
116 "lock ; xchgl %0, (%1)\n"
117 :
"=r" (
result) :
"r" (
lock),
"0" (1) :
"cc",
"memory");
120 #elif defined(__MACOSX__) || defined(__IPHONEOS__)
122 return OSAtomicCompareAndSwap32Barrier(0, 1,
lock);
124 #elif defined(__SOLARIS__) && defined(_LP64)
128 #elif defined(__SOLARIS__) && !defined(_LP64)
133 #error Please implement for your platform.
139 #if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
140 #define PAUSE_INSTRUCTION() __asm__ __volatile__("pause\n")
141 #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
142 #define PAUSE_INSTRUCTION() _mm_pause()
143 #elif defined(__WATCOMC__) && defined(__386__)
146 #pragma aux PAUSE_INSTRUCTION = "db 0f3h,90h"
148 #define PAUSE_INSTRUCTION()
170 #if defined(_MSC_VER)
174 #elif defined(__WATCOMC__) && defined(__386__)
178 #elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET
179 __sync_lock_release(
lock);
181 #elif defined(__SOLARIS__)
void SDL_AtomicLock(SDL_SpinLock *lock)
Lock a spin lock by setting it to a non-zero value.
SDL_bool SDL_AtomicTryLock(SDL_SpinLock *lock)
Try to lock a spin lock by setting it to a non-zero value.
GLboolean GLboolean GLboolean GLboolean a
void SDL_AtomicUnlock(SDL_SpinLock *lock)
Unlock a spin lock by setting it to 0. Always returns immediately.
#define SDL_COMPILE_TIME_ASSERT(name, x)
#define SDL_CompilerBarrier()
#define PAUSE_INSTRUCTION()
unsigned long long uint64_t