Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
It's now possible to disable the fast atomic operations, at a huge pe…
Browse files Browse the repository at this point in the history
…rformance penalty.
  • Loading branch information
slouken committed Feb 8, 2011
1 parent 96c491f commit 7c0c1e8
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 1 deletion.
6 changes: 6 additions & 0 deletions configure.in
Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions include/SDL_atomic.h
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions include/SDL_config.h.in
Expand Up @@ -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
Expand Down
21 changes: 20 additions & 1 deletion src/atomic/SDL_spinlock.c
Expand Up @@ -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 */
Expand All @@ -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);

Expand Down

0 comments on commit 7c0c1e8

Please sign in to comment.