It's now possible to disable the fast atomic operations, at a huge performance penalty.
This commit is contained in:
parent
8253658837
commit
8f205278b1
4 changed files with 30 additions and 1 deletions
|
@ -422,6 +422,12 @@ AC_HELP_STRING([--enable-cpuinfo], [Enable the cpuinfo subsystem [[default=yes]]
|
|||
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)
|
||||
|
|
|
@ -141,6 +141,9 @@ void _ReadWriteBarrier(void);
|
|||
/* 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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue