Mercurial > sdl-ios-xcode
changeset 5230:5d01d426f2ea
It's now possible to disable the fast atomic operations, at a huge performance penalty.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 07 Feb 2011 22:57:33 -0800 |
parents | 2178ffe17222 |
children | 710d00cb3a6a |
files | configure.in include/SDL_atomic.h include/SDL_config.h.in src/atomic/SDL_spinlock.c |
diffstat | 4 files changed, 30 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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)
--- 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
--- 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
--- 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);