24 #include "SDL_mutex.h"
29 #include "../core/windows/SDL_windows.h"
36 #if SDL_ATOMIC_DISABLED
40 if (!_spinlock_mutex) {
54 #elif defined(_MSC_VER)
56 return (InterlockedExchange((
long*)lock, 1) == 0);
58 #elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET
59 return (__sync_lock_test_and_set(lock, 1) == 0);
61 #elif defined(__GNUC__) && defined(__arm__) && \
62 (defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || \
63 defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5TE__) || \
64 defined(__ARM_ARCH_5TEJ__))
66 __asm__ __volatile__ (
68 :
"=&r,&r" (result) :
"r,0" (1),
"r,r" (lock) :
"memory");
71 #elif defined(__GNUC__) && defined(__arm__)
73 __asm__ __volatile__ (
74 "ldrex %0, [%2]\nteq %0, #0\nstrexeq %0, %1, [%2]"
75 :
"=&r" (result) :
"r" (1),
"r" (lock) :
"cc",
"memory");
78 #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
81 "lock ; xchgl %0, (%1)\n"
82 :
"=r" (result) :
"r" (lock),
"0" (1) :
"cc",
"memory");
85 #elif defined(__MACOSX__) || defined(__IPHONEOS__)
87 return OSAtomicCompareAndSwap32Barrier(0, 1, lock);
89 #elif HAVE_PTHREAD_SPINLOCK
91 return (pthread_spin_trylock(lock) == 0);
94 #error Please implement for your platform.
111 #if defined(_MSC_VER)
115 #elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET
116 __sync_lock_release(lock);
118 #elif HAVE_PTHREAD_SPINLOCK
119 pthread_spin_unlock(lock);
DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock)
Unlock a spin lock by setting it to 0. Always returns immediately.
DECLSPEC int SDLCALL SDL_LockMutex(SDL_mutex *mutex)
DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock)
Try to lock a spin lock by setting it to a non-zero value.
#define SDL_COMPILE_TIME_ASSERT(name, x)
DECLSPEC SDL_mutex *SDLCALL SDL_CreateMutex(void)
DECLSPEC int SDLCALL SDL_UnlockMutex(SDL_mutex *mutex)
DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock)
Lock a spin lock by setting it to a non-zero value.
DECLSPEC void SDLCALL SDL_Delay(Uint32 ms)
Wait a specified number of milliseconds before returning.
struct SDL_mutex SDL_mutex