Mercurial > sdl-ios-xcode
comparison src/atomic/SDL_spinlock.c @ 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 | b938ad843e52 |
children | b530ef003506 |
comparison
equal
deleted
inserted
replaced
5229:2178ffe17222 | 5230:5d01d426f2ea |
---|---|
20 slouken@libsdl.org | 20 slouken@libsdl.org |
21 */ | 21 */ |
22 #include "SDL_stdinc.h" | 22 #include "SDL_stdinc.h" |
23 | 23 |
24 #include "SDL_atomic.h" | 24 #include "SDL_atomic.h" |
25 #include "SDL_mutex.h" | |
25 #include "SDL_timer.h" | 26 #include "SDL_timer.h" |
26 | 27 |
27 /* Don't do the check for Visual Studio 2005, it's safe here */ | 28 /* Don't do the check for Visual Studio 2005, it's safe here */ |
28 #ifdef __WIN32__ | 29 #ifdef __WIN32__ |
29 #include "../core/windows/SDL_windows.h" | 30 #include "../core/windows/SDL_windows.h" |
31 | 32 |
32 /* This function is where all the magic happens... */ | 33 /* This function is where all the magic happens... */ |
33 SDL_bool | 34 SDL_bool |
34 SDL_AtomicTryLock(SDL_SpinLock *lock) | 35 SDL_AtomicTryLock(SDL_SpinLock *lock) |
35 { | 36 { |
36 #if defined(_MSC_VER) | 37 #if SDL_ATOMIC_DISABLED |
38 /* Terrible terrible damage */ | |
39 static SDL_mutex *_spinlock_mutex; | |
40 | |
41 if (!_spinlock_mutex) { | |
42 /* Race condition on first lock... */ | |
43 _spinlock_mutex = SDL_CreateMutex(); | |
44 } | |
45 SDL_mutexP(_spinlock_mutex); | |
46 if (*lock == 0) { | |
47 *lock = 1; | |
48 SDL_mutexV(_spinlock_mutex); | |
49 return SDL_TRUE; | |
50 } else { | |
51 SDL_mutexV(_spinlock_mutex); | |
52 return SDL_FALSE; | |
53 } | |
54 | |
55 #elif defined(_MSC_VER) | |
37 SDL_COMPILE_TIME_ASSERT(locksize, sizeof(*lock) == sizeof(long)); | 56 SDL_COMPILE_TIME_ASSERT(locksize, sizeof(*lock) == sizeof(long)); |
38 return (InterlockedExchange((long*)lock, 1) == 0); | 57 return (InterlockedExchange((long*)lock, 1) == 0); |
39 | 58 |
40 #elif defined(__MACOSX__) | 59 #elif defined(__MACOSX__) |
41 return OSAtomicCompareAndSwap32Barrier(0, 1, lock); | 60 return OSAtomicCompareAndSwap32Barrier(0, 1, lock); |