Commit 82283b72 authored by Ryan C. Gordon's avatar Ryan C. Gordon

Implemented x86 and x86-64 spinlock inline asm.

Favor it over Mac OS X API for Intel systems (but not GCC atomic intrinsics).

This might get us a little further on Cygwin builds, too.
parent 6fcfc35b
...@@ -55,9 +55,6 @@ SDL_AtomicTryLock(SDL_SpinLock *lock) ...@@ -55,9 +55,6 @@ SDL_AtomicTryLock(SDL_SpinLock *lock)
SDL_COMPILE_TIME_ASSERT(locksize, sizeof(*lock) == sizeof(long)); SDL_COMPILE_TIME_ASSERT(locksize, sizeof(*lock) == sizeof(long));
return (InterlockedExchange((long*)lock, 1) == 0); return (InterlockedExchange((long*)lock, 1) == 0);
#elif defined(__MACOSX__)
return OSAtomicCompareAndSwap32Barrier(0, 1, lock);
#elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET #elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET
return (__sync_lock_test_and_set(lock, 1) == 0); return (__sync_lock_test_and_set(lock, 1) == 0);
...@@ -77,10 +74,22 @@ SDL_AtomicTryLock(SDL_SpinLock *lock) ...@@ -77,10 +74,22 @@ SDL_AtomicTryLock(SDL_SpinLock *lock)
: "=&r" (result) : "r" (1), "r" (lock) : "cc", "memory"); : "=&r" (result) : "r" (1), "r" (lock) : "cc", "memory");
return (result == 0); return (result == 0);
#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
int result;
__asm__ __volatile__(
"lock ; xchgl %0, (%1)\n"
: "=r" (result) : "r" (lock), "0" (1) : "cc", "memory");
return (result == 0);
#elif defined(__MACOSX__)
/* Maybe used for PowerPC, but the Intel asm or gcc atomics are favored. */
return OSAtomicCompareAndSwap32Barrier(0, 1, lock);
#elif HAVE_PTHREAD_SPINLOCK #elif HAVE_PTHREAD_SPINLOCK
/* pthread instructions */ /* pthread instructions */
return (pthread_spin_trylock(lock) == 0); return (pthread_spin_trylock(lock) == 0);
#else
#else
#error Please implement for your platform. #error Please implement for your platform.
return SDL_FALSE; return SDL_FALSE;
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment