It's now possible to disable the fast atomic operations, at a huge performance penalty.
authorSam Lantinga <slouken@libsdl.org>
Mon, 07 Feb 2011 22:57:33 -0800
changeset 5225 5d01d426f2ea
parent 5224 2178ffe17222
child 5226 710d00cb3a6a
It's now possible to disable the fast atomic operations, at a huge performance penalty.
configure.in
include/SDL_atomic.h
include/SDL_config.h.in
src/atomic/SDL_spinlock.c
--- 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);