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
|
if test x$enable_cpuinfo != xyes; then
|
||||||
AC_DEFINE(SDL_CPUINFO_DISABLED)
|
AC_DEFINE(SDL_CPUINFO_DISABLED)
|
||||||
fi
|
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_ARG_ENABLE(assembly,
|
||||||
AC_HELP_STRING([--enable-assembly], [Enable assembly routines [[default=yes]]]),
|
AC_HELP_STRING([--enable-assembly], [Enable assembly routines [[default=yes]]]),
|
||||||
, enable_assembly=yes)
|
, enable_assembly=yes)
|
||||||
|
|
|
@ -141,6 +141,9 @@ void _ReadWriteBarrier(void);
|
||||||
/* Platform specific optimized versions of the atomic functions,
|
/* Platform specific optimized versions of the atomic functions,
|
||||||
* you can disable these by defining SDL_DISABLE_ATOMIC_INLINE
|
* 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
|
#ifndef SDL_DISABLE_ATOMIC_INLINE
|
||||||
|
|
||||||
#ifdef HAVE_MSC_ATOMICS
|
#ifdef HAVE_MSC_ATOMICS
|
||||||
|
|
|
@ -171,6 +171,7 @@
|
||||||
#undef SDL_DEFAULT_ASSERT_LEVEL
|
#undef SDL_DEFAULT_ASSERT_LEVEL
|
||||||
|
|
||||||
/* Allow disabling of core subsystems */
|
/* Allow disabling of core subsystems */
|
||||||
|
#undef SDL_ATOMIC_DISABLED
|
||||||
#undef SDL_AUDIO_DISABLED
|
#undef SDL_AUDIO_DISABLED
|
||||||
#undef SDL_CPUINFO_DISABLED
|
#undef SDL_CPUINFO_DISABLED
|
||||||
#undef SDL_EVENTS_DISABLED
|
#undef SDL_EVENTS_DISABLED
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "SDL_stdinc.h"
|
#include "SDL_stdinc.h"
|
||||||
|
|
||||||
#include "SDL_atomic.h"
|
#include "SDL_atomic.h"
|
||||||
|
#include "SDL_mutex.h"
|
||||||
#include "SDL_timer.h"
|
#include "SDL_timer.h"
|
||||||
|
|
||||||
/* Don't do the check for Visual Studio 2005, it's safe here */
|
/* Don't do the check for Visual Studio 2005, it's safe here */
|
||||||
|
@ -33,7 +34,25 @@
|
||||||
SDL_bool
|
SDL_bool
|
||||||
SDL_AtomicTryLock(SDL_SpinLock *lock)
|
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));
|
SDL_COMPILE_TIME_ASSERT(locksize, sizeof(*lock) == sizeof(long));
|
||||||
return (InterlockedExchange((long*)lock, 1) == 0);
|
return (InterlockedExchange((long*)lock, 1) == 0);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue