# HG changeset patch # User Sam Lantinga # Date 1297148253 28800 # Node ID 5d01d426f2ea1c846e2251f4064164ad79eb9e8e # Parent 2178ffe172224c276a93f04386bed86203e14d21 It's now possible to disable the fast atomic operations, at a huge performance penalty. diff -r 2178ffe17222 -r 5d01d426f2ea configure.in --- a/configure.in Mon Feb 07 20:06:26 2011 -0800 +++ b/configure.in Mon Feb 07 22:57:33 2011 -0800 @@ -422,6 +422,12 @@ if test x$enable_cpuinfo != xyes; then AC_DEFINE(SDL_CPUINFO_DISABLED) fi +AC_ARG_ENABLE(atomic, +AC_HELP_STRING([--enable-atomic], [Enable the atomic operations [[default=yes]]]), + , enable_atomic=yes) +if test x$enable_atomic != xyes; then + AC_DEFINE(SDL_ATOMIC_DISABLED) +fi AC_ARG_ENABLE(assembly, AC_HELP_STRING([--enable-assembly], [Enable assembly routines [[default=yes]]]), , enable_assembly=yes) diff -r 2178ffe17222 -r 5d01d426f2ea include/SDL_atomic.h --- a/include/SDL_atomic.h Mon Feb 07 20:06:26 2011 -0800 +++ b/include/SDL_atomic.h Mon Feb 07 22:57:33 2011 -0800 @@ -141,6 +141,9 @@ /* Platform specific optimized versions of the atomic functions, * you can disable these by defining SDL_DISABLE_ATOMIC_INLINE */ +#if SDL_ATOMIC_DISABLED +#define SDL_DISABLE_ATOMIC_INLINE +#endif #ifndef SDL_DISABLE_ATOMIC_INLINE #ifdef HAVE_MSC_ATOMICS diff -r 2178ffe17222 -r 5d01d426f2ea include/SDL_config.h.in --- a/include/SDL_config.h.in Mon Feb 07 20:06:26 2011 -0800 +++ b/include/SDL_config.h.in Mon Feb 07 22:57:33 2011 -0800 @@ -171,6 +171,7 @@ #undef SDL_DEFAULT_ASSERT_LEVEL /* Allow disabling of core subsystems */ +#undef SDL_ATOMIC_DISABLED #undef SDL_AUDIO_DISABLED #undef SDL_CPUINFO_DISABLED #undef SDL_EVENTS_DISABLED diff -r 2178ffe17222 -r 5d01d426f2ea src/atomic/SDL_spinlock.c --- a/src/atomic/SDL_spinlock.c Mon Feb 07 20:06:26 2011 -0800 +++ b/src/atomic/SDL_spinlock.c Mon Feb 07 22:57:33 2011 -0800 @@ -22,6 +22,7 @@ #include "SDL_stdinc.h" #include "SDL_atomic.h" +#include "SDL_mutex.h" #include "SDL_timer.h" /* Don't do the check for Visual Studio 2005, it's safe here */ @@ -33,7 +34,25 @@ SDL_bool SDL_AtomicTryLock(SDL_SpinLock *lock) { -#if defined(_MSC_VER) +#if SDL_ATOMIC_DISABLED + /* Terrible terrible damage */ + static SDL_mutex *_spinlock_mutex; + + if (!_spinlock_mutex) { + /* Race condition on first lock... */ + _spinlock_mutex = SDL_CreateMutex(); + } + SDL_mutexP(_spinlock_mutex); + if (*lock == 0) { + *lock = 1; + SDL_mutexV(_spinlock_mutex); + return SDL_TRUE; + } else { + SDL_mutexV(_spinlock_mutex); + return SDL_FALSE; + } + +#elif defined(_MSC_VER) SDL_COMPILE_TIME_ASSERT(locksize, sizeof(*lock) == sizeof(long)); return (InterlockedExchange((long*)lock, 1) == 0);