mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	Updated the atomic API for SDL 3.0 naming conventions
Fixes https://github.com/libsdl-org/SDL/issues/7388
This commit is contained in:
		| @@ -2884,3 +2884,28 @@ expression e1, e2, e3, e4; | |||||||
| - SDL_HapticRumbleStop | - SDL_HapticRumbleStop | ||||||
| + SDL_StopHapticRumble | + SDL_StopHapticRumble | ||||||
|   (...) |   (...) | ||||||
|  | @@ | ||||||
|  | @@ | ||||||
|  | - SDL_AtomicTryLock | ||||||
|  | + SDL_TryLockSpinlock | ||||||
|  |   (...) | ||||||
|  | @@ | ||||||
|  | @@ | ||||||
|  | - SDL_AtomicLock | ||||||
|  | + SDL_LockSpinlock | ||||||
|  |   (...) | ||||||
|  | @@ | ||||||
|  | @@ | ||||||
|  | - SDL_AtomicUnlock | ||||||
|  | + SDL_UnlockSpinlock | ||||||
|  |   (...) | ||||||
|  | @@ | ||||||
|  | @@ | ||||||
|  | - SDL_AtomicCAS | ||||||
|  | + SDL_AtomicCompareAndSwap | ||||||
|  |   (...) | ||||||
|  | @@ | ||||||
|  | @@ | ||||||
|  | - SDL_AtomicCASPtr | ||||||
|  | + SDL_AtomicCompareAndSwapPointer | ||||||
|  |   (...) | ||||||
|   | |||||||
| @@ -47,6 +47,13 @@ The vi format comments have been removed from source code. Vim users can use the | |||||||
| The following structures have been renamed: | The following structures have been renamed: | ||||||
| - SDL_atomic_t => SDL_AtomicInt | - SDL_atomic_t => SDL_AtomicInt | ||||||
|  |  | ||||||
|  | The following functions have been renamed: | ||||||
|  | * SDL_AtomicCAS() => SDL_AtomicCompareAndSwap() | ||||||
|  | * SDL_AtomicCASPtr() => SDL_AtomicCompareAndSwapPointer() | ||||||
|  | * SDL_AtomicLock() => SDL_LockSpinlock() | ||||||
|  | * SDL_AtomicTryLock() => SDL_TryLockSpinlock() | ||||||
|  | * SDL_AtomicUnlock() => SDL_UnlockSpinlock() | ||||||
|  |  | ||||||
| ## SDL_audio.h | ## SDL_audio.h | ||||||
|  |  | ||||||
| The audio subsystem in SDL3 is dramatically different than SDL2. The primary way to play audio is no longer an audio callback; instead you bind SDL_AudioStreams to devices; however, there is still a callback method available if needed. | The audio subsystem in SDL3 is dramatically different than SDL2. The primary way to play audio is no longer an audio callback; instead you bind SDL_AudioStreams to devices; however, there is still a callback method available if needed. | ||||||
|   | |||||||
| @@ -31,8 +31,8 @@ | |||||||
|  * with full mutexes. |  * with full mutexes. | ||||||
|  * |  * | ||||||
|  * The list of "safe" functions to use are: |  * The list of "safe" functions to use are: | ||||||
|  *  SDL_AtomicLock() |  *  SDL_LockSpinlock() | ||||||
|  *  SDL_AtomicUnlock() |  *  SDL_UnlockSpinlock() | ||||||
|  *  SDL_AtomicIncRef() |  *  SDL_AtomicIncRef() | ||||||
|  *  SDL_AtomicDecRef() |  *  SDL_AtomicDecRef() | ||||||
|  * |  * | ||||||
| @@ -105,10 +105,10 @@ typedef int SDL_SpinLock; | |||||||
|  * |  * | ||||||
|  * \since This function is available since SDL 3.0.0. |  * \since This function is available since SDL 3.0.0. | ||||||
|  * |  * | ||||||
|  * \sa SDL_AtomicLock |  * \sa SDL_LockSpinlock | ||||||
|  * \sa SDL_AtomicUnlock |  * \sa SDL_UnlockSpinlock | ||||||
|  */ |  */ | ||||||
| extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock); | extern DECLSPEC SDL_bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Lock a spin lock by setting it to a non-zero value. |  * Lock a spin lock by setting it to a non-zero value. | ||||||
| @@ -120,10 +120,10 @@ extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock); | |||||||
|  * |  * | ||||||
|  * \since This function is available since SDL 3.0.0. |  * \since This function is available since SDL 3.0.0. | ||||||
|  * |  * | ||||||
|  * \sa SDL_AtomicTryLock |  * \sa SDL_TryLockSpinlock | ||||||
|  * \sa SDL_AtomicUnlock |  * \sa SDL_UnlockSpinlock | ||||||
|  */ |  */ | ||||||
| extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock); | extern DECLSPEC void SDLCALL SDL_LockSpinlock(SDL_SpinLock *lock); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Unlock a spin lock by setting it to 0. |  * Unlock a spin lock by setting it to 0. | ||||||
| @@ -137,10 +137,10 @@ extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock); | |||||||
|  * |  * | ||||||
|  * \since This function is available since SDL 3.0.0. |  * \since This function is available since SDL 3.0.0. | ||||||
|  * |  * | ||||||
|  * \sa SDL_AtomicLock |  * \sa SDL_LockSpinlock | ||||||
|  * \sa SDL_AtomicTryLock |  * \sa SDL_TryLockSpinlock | ||||||
|  */ |  */ | ||||||
| extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); | extern DECLSPEC void SDLCALL SDL_UnlockSpinlock(SDL_SpinLock *lock); | ||||||
|  |  | ||||||
| /* @} *//* SDL AtomicLock */ | /* @} *//* SDL AtomicLock */ | ||||||
|  |  | ||||||
| @@ -161,7 +161,7 @@ extern __inline void SDL_CompilerBarrier(void); | |||||||
| #pragma aux SDL_CompilerBarrier = "" parm [] modify exact []; | #pragma aux SDL_CompilerBarrier = "" parm [] modify exact []; | ||||||
| #else | #else | ||||||
| #define SDL_CompilerBarrier()   \ | #define SDL_CompilerBarrier()   \ | ||||||
| { SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); } | { SDL_SpinLock _tmp = 0; SDL_LockSpinlock(&_tmp); SDL_UnlockSpinlock(&_tmp); } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -282,11 +282,11 @@ typedef struct { int value; } SDL_AtomicInt; | |||||||
|  * |  * | ||||||
|  * \since This function is available since SDL 3.0.0. |  * \since This function is available since SDL 3.0.0. | ||||||
|  * |  * | ||||||
|  * \sa SDL_AtomicCASPtr |  * \sa SDL_AtomicCompareAndSwapPointer | ||||||
|  * \sa SDL_AtomicGet |  * \sa SDL_AtomicGet | ||||||
|  * \sa SDL_AtomicSet |  * \sa SDL_AtomicSet | ||||||
|  */ |  */ | ||||||
| extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS(SDL_AtomicInt *a, int oldval, int newval); | extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwap(SDL_AtomicInt *a, int oldval, int newval); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Set an atomic variable to a value. |  * Set an atomic variable to a value. | ||||||
| @@ -370,11 +370,11 @@ extern DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v); | |||||||
|  * |  * | ||||||
|  * \since This function is available since SDL 3.0.0. |  * \since This function is available since SDL 3.0.0. | ||||||
|  * |  * | ||||||
|  * \sa SDL_AtomicCAS |  * \sa SDL_AtomicCompareAndSwap | ||||||
|  * \sa SDL_AtomicGetPtr |  * \sa SDL_AtomicGetPtr | ||||||
|  * \sa SDL_AtomicSetPtr |  * \sa SDL_AtomicSetPtr | ||||||
|  */ |  */ | ||||||
| extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void **a, void *oldval, void *newval); | extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwapPointer(void **a, void *oldval, void *newval); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Set a pointer to a value atomically. |  * Set a pointer to a value atomically. | ||||||
| @@ -388,7 +388,7 @@ extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void **a, void *oldval, void * | |||||||
|  * |  * | ||||||
|  * \since This function is available since SDL 3.0.0. |  * \since This function is available since SDL 3.0.0. | ||||||
|  * |  * | ||||||
|  * \sa SDL_AtomicCASPtr |  * \sa SDL_AtomicCompareAndSwapPointer | ||||||
|  * \sa SDL_AtomicGetPtr |  * \sa SDL_AtomicGetPtr | ||||||
|  */ |  */ | ||||||
| extern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v); | extern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v); | ||||||
| @@ -404,7 +404,7 @@ extern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v); | |||||||
|  * |  * | ||||||
|  * \since This function is available since SDL 3.0.0. |  * \since This function is available since SDL 3.0.0. | ||||||
|  * |  * | ||||||
|  * \sa SDL_AtomicCASPtr |  * \sa SDL_AtomicCompareAndSwapPointer | ||||||
|  * \sa SDL_AtomicSetPtr |  * \sa SDL_AtomicSetPtr | ||||||
|  */ |  */ | ||||||
| extern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a); | extern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a); | ||||||
|   | |||||||
| @@ -40,6 +40,11 @@ | |||||||
| #ifdef SDL_ENABLE_OLD_NAMES | #ifdef SDL_ENABLE_OLD_NAMES | ||||||
|  |  | ||||||
| /* ##SDL_atomic.h */ | /* ##SDL_atomic.h */ | ||||||
|  | #define SDL_AtomicCAS SDL_AtomicCompareAndSwap | ||||||
|  | #define SDL_AtomicCASPtr SDL_AtomicCompareAndSwapPointer | ||||||
|  | #define SDL_AtomicLock SDL_LockSpinlock | ||||||
|  | #define SDL_AtomicTryLock SDL_TryLockSpinlock | ||||||
|  | #define SDL_AtomicUnlock SDL_UnlockSpinlock | ||||||
| #define SDL_atomic_t SDL_AtomicInt | #define SDL_atomic_t SDL_AtomicInt | ||||||
|  |  | ||||||
| /* ##SDL_audio.h */ | /* ##SDL_audio.h */ | ||||||
| @@ -512,6 +517,13 @@ | |||||||
|  |  | ||||||
| #elif !defined(SDL_DISABLE_OLD_NAMES) | #elif !defined(SDL_DISABLE_OLD_NAMES) | ||||||
|  |  | ||||||
|  | /* ##SDL_atomic.h */ | ||||||
|  | #define SDL_AtomicCAS SDL_AtomicCAS_renamed_SDL_AtomicCompareAndSwap | ||||||
|  | #define SDL_AtomicCASPtr SDL_AtomicCASPtr_renamed_SDL_AtomicCompareAndSwapPointer | ||||||
|  | #define SDL_AtomicLock SDL_AtomicLock_renamed_SDL_LockSpinlock | ||||||
|  | #define SDL_AtomicTryLock SDL_AtomicTryLock_renamed_SDL_TryLockSpinlock | ||||||
|  | #define SDL_AtomicUnlock SDL_AtomicUnlock_renamed_SDL_UnlockSpinlock | ||||||
|  |  | ||||||
| /* ##SDL_audio.h */ | /* ##SDL_audio.h */ | ||||||
| #define AUDIO_F32 AUDIO_F32_renamed_SDL_AUDIO_F32LE | #define AUDIO_F32 AUDIO_F32_renamed_SDL_AUDIO_F32LE | ||||||
| #define AUDIO_F32LSB AUDIO_F32LSB_renamed_SDL_AUDIO_F32LE | #define AUDIO_F32LSB AUDIO_F32LSB_renamed_SDL_AUDIO_F32LE | ||||||
|   | |||||||
| @@ -333,15 +333,15 @@ SDL_AssertState SDL_ReportAssertion(SDL_AssertData *data, const char *func, cons | |||||||
|  |  | ||||||
| #ifndef SDL_THREADS_DISABLED | #ifndef SDL_THREADS_DISABLED | ||||||
|     static SDL_SpinLock spinlock = 0; |     static SDL_SpinLock spinlock = 0; | ||||||
|     SDL_AtomicLock(&spinlock); |     SDL_LockSpinlock(&spinlock); | ||||||
|     if (!assertion_mutex) { /* never called SDL_Init()? */ |     if (!assertion_mutex) { /* never called SDL_Init()? */ | ||||||
|         assertion_mutex = SDL_CreateMutex(); |         assertion_mutex = SDL_CreateMutex(); | ||||||
|         if (!assertion_mutex) { |         if (!assertion_mutex) { | ||||||
|             SDL_AtomicUnlock(&spinlock); |             SDL_UnlockSpinlock(&spinlock); | ||||||
|             return SDL_ASSERTION_IGNORE; /* oh well, I guess. */ |             return SDL_ASSERTION_IGNORE; /* oh well, I guess. */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     SDL_AtomicUnlock(&spinlock); |     SDL_UnlockSpinlock(&spinlock); | ||||||
|  |  | ||||||
|     SDL_LockMutex(assertion_mutex); |     SDL_LockMutex(assertion_mutex); | ||||||
| #endif /* !SDL_THREADS_DISABLED */ | #endif /* !SDL_THREADS_DISABLED */ | ||||||
|   | |||||||
| @@ -111,18 +111,18 @@ static SDL_INLINE void enterLock(void *a) | |||||||
| { | { | ||||||
|     uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f); |     uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f); | ||||||
|  |  | ||||||
|     SDL_AtomicLock(&locks[index]); |     SDL_LockSpinlock(&locks[index]); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_INLINE void leaveLock(void *a) | static SDL_INLINE void leaveLock(void *a) | ||||||
| { | { | ||||||
|     uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f); |     uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f); | ||||||
|  |  | ||||||
|     SDL_AtomicUnlock(&locks[index]); |     SDL_UnlockSpinlock(&locks[index]); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| SDL_bool SDL_AtomicCAS(SDL_AtomicInt *a, int oldval, int newval) | SDL_bool SDL_AtomicCompareAndSwap(SDL_AtomicInt *a, int oldval, int newval) | ||||||
| { | { | ||||||
| #ifdef HAVE_MSC_ATOMICS | #ifdef HAVE_MSC_ATOMICS | ||||||
|     SDL_COMPILE_TIME_ASSERT(atomic_cas, sizeof(long) == sizeof(a->value)); |     SDL_COMPILE_TIME_ASSERT(atomic_cas, sizeof(long) == sizeof(a->value)); | ||||||
| @@ -151,7 +151,7 @@ SDL_bool SDL_AtomicCAS(SDL_AtomicInt *a, int oldval, int newval) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| SDL_bool SDL_AtomicCASPtr(void **a, void *oldval, void *newval) | SDL_bool SDL_AtomicCompareAndSwapPointer(void **a, void *oldval, void *newval) | ||||||
| { | { | ||||||
| #ifdef HAVE_MSC_ATOMICS | #ifdef HAVE_MSC_ATOMICS | ||||||
|     return _InterlockedCompareExchangePointer(a, newval, oldval) == oldval; |     return _InterlockedCompareExchangePointer(a, newval, oldval) == oldval; | ||||||
| @@ -196,7 +196,7 @@ int SDL_AtomicSet(SDL_AtomicInt *a, int v) | |||||||
|     int value; |     int value; | ||||||
|     do { |     do { | ||||||
|         value = a->value; |         value = a->value; | ||||||
|     } while (!SDL_AtomicCAS(a, value, v)); |     } while (!SDL_AtomicCompareAndSwap(a, value, v)); | ||||||
|     return value; |     return value; | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| @@ -215,7 +215,7 @@ void *SDL_AtomicSetPtr(void **a, void *v) | |||||||
|     void *value; |     void *value; | ||||||
|     do { |     do { | ||||||
|         value = *a; |         value = *a; | ||||||
|     } while (!SDL_AtomicCASPtr(a, value, v)); |     } while (!SDL_AtomicCompareAndSwapPointer(a, value, v)); | ||||||
|     return value; |     return value; | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| @@ -238,7 +238,7 @@ int SDL_AtomicAdd(SDL_AtomicInt *a, int v) | |||||||
|     int value; |     int value; | ||||||
|     do { |     do { | ||||||
|         value = a->value; |         value = a->value; | ||||||
|     } while (!SDL_AtomicCAS(a, value, (value + v))); |     } while (!SDL_AtomicCompareAndSwap(a, value, (value + v))); | ||||||
|     return value; |     return value; | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| @@ -262,7 +262,7 @@ int SDL_AtomicGet(SDL_AtomicInt *a) | |||||||
|     int value; |     int value; | ||||||
|     do { |     do { | ||||||
|         value = a->value; |         value = a->value; | ||||||
|     } while (!SDL_AtomicCAS(a, value, value)); |     } while (!SDL_AtomicCompareAndSwap(a, value, value)); | ||||||
|     return value; |     return value; | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| @@ -281,7 +281,7 @@ void *SDL_AtomicGetPtr(void **a) | |||||||
|     void *value; |     void *value; | ||||||
|     do { |     do { | ||||||
|         value = *a; |         value = *a; | ||||||
|     } while (!SDL_AtomicCASPtr(a, value, value)); |     } while (!SDL_AtomicCompareAndSwapPointer(a, value, value)); | ||||||
|     return value; |     return value; | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|   | |||||||
| @@ -57,7 +57,7 @@ extern __inline int _SDL_xchg_watcom(volatile int *a, int v); | |||||||
| /* *INDENT-ON* */ /* clang-format on */ | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
| /* This function is where all the magic happens... */ | /* This function is where all the magic happens... */ | ||||||
| SDL_bool SDL_AtomicTryLock(SDL_SpinLock *lock) | SDL_bool SDL_TryLockSpinlock(SDL_SpinLock *lock) | ||||||
| { | { | ||||||
| #if defined(HAVE_GCC_ATOMICS) || defined(HAVE_GCC_SYNC_LOCK_TEST_AND_SET) | #if defined(HAVE_GCC_ATOMICS) || defined(HAVE_GCC_SYNC_LOCK_TEST_AND_SET) | ||||||
|     return __sync_lock_test_and_set(lock, 1) == 0; |     return __sync_lock_test_and_set(lock, 1) == 0; | ||||||
| @@ -161,11 +161,11 @@ SDL_bool SDL_AtomicTryLock(SDL_SpinLock *lock) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_AtomicLock(SDL_SpinLock *lock) | void SDL_LockSpinlock(SDL_SpinLock *lock) | ||||||
| { | { | ||||||
|     int iterations = 0; |     int iterations = 0; | ||||||
|     /* FIXME: Should we have an eventual timeout? */ |     /* FIXME: Should we have an eventual timeout? */ | ||||||
|     while (!SDL_AtomicTryLock(lock)) { |     while (!SDL_TryLockSpinlock(lock)) { | ||||||
|         if (iterations < 32) { |         if (iterations < 32) { | ||||||
|             iterations++; |             iterations++; | ||||||
|             SDL_CPUPauseInstruction(); |             SDL_CPUPauseInstruction(); | ||||||
| @@ -176,7 +176,7 @@ void SDL_AtomicLock(SDL_SpinLock *lock) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_AtomicUnlock(SDL_SpinLock *lock) | void SDL_UnlockSpinlock(SDL_SpinLock *lock) | ||||||
| { | { | ||||||
| #if defined(HAVE_GCC_ATOMICS) || defined(HAVE_GCC_SYNC_LOCK_TEST_AND_SET) | #if defined(HAVE_GCC_ATOMICS) || defined(HAVE_GCC_SYNC_LOCK_TEST_AND_SET) | ||||||
|     __sync_lock_release(lock); |     __sync_lock_release(lock); | ||||||
|   | |||||||
| @@ -635,7 +635,7 @@ void SDL_AudioDeviceDisconnected(SDL_AudioDevice *device) | |||||||
|     const SDL_bool is_default_device = ((devid == current_audio.default_output_device_id) || (devid == current_audio.default_capture_device_id)); |     const SDL_bool is_default_device = ((devid == current_audio.default_output_device_id) || (devid == current_audio.default_capture_device_id)); | ||||||
|     SDL_UnlockRWLock(current_audio.device_hash_lock); |     SDL_UnlockRWLock(current_audio.device_hash_lock); | ||||||
|  |  | ||||||
|     const SDL_bool first_disconnect = SDL_AtomicCAS(&device->zombie, 0, 1); |     const SDL_bool first_disconnect = SDL_AtomicCompareAndSwap(&device->zombie, 0, 1); | ||||||
|     if (first_disconnect) {   // if already disconnected this device, don't do it twice. |     if (first_disconnect) {   // if already disconnected this device, don't do it twice. | ||||||
|         // Swap in "Zombie" versions of the usual platform interfaces, so the device will keep |         // Swap in "Zombie" versions of the usual platform interfaces, so the device will keep | ||||||
|         // making progress until the app closes it. Otherwise, streams might continue to |         // making progress until the app closes it. Otherwise, streams might continue to | ||||||
| @@ -809,7 +809,7 @@ int SDL_InitAudio(const char *driver_name) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // make sure device IDs start at 2 (because of SDL2 legacy interface), but don't reset the counter on each init, in case the app is holding an old device ID somewhere. |     // make sure device IDs start at 2 (because of SDL2 legacy interface), but don't reset the counter on each init, in case the app is holding an old device ID somewhere. | ||||||
|     SDL_AtomicCAS(&last_device_instance_id, 0, 2); |     SDL_AtomicCompareAndSwap(&last_device_instance_id, 0, 2); | ||||||
|  |  | ||||||
|     SDL_ChooseAudioConverters(); |     SDL_ChooseAudioConverters(); | ||||||
|     SDL_SetupAudioResampler(); |     SDL_SetupAudioResampler(); | ||||||
|   | |||||||
| @@ -168,9 +168,9 @@ static void SDL_DBus_Init_Spinlocked(void) | |||||||
|  |  | ||||||
| void SDL_DBus_Init(void) | void SDL_DBus_Init(void) | ||||||
| { | { | ||||||
|     SDL_AtomicLock(&spinlock_dbus_init); /* make sure two threads can't init at same time, since this can happen before SDL_Init. */ |     SDL_LockSpinlock(&spinlock_dbus_init); /* make sure two threads can't init at same time, since this can happen before SDL_Init. */ | ||||||
|     SDL_DBus_Init_Spinlocked(); |     SDL_DBus_Init_Spinlocked(); | ||||||
|     SDL_AtomicUnlock(&spinlock_dbus_init); |     SDL_UnlockSpinlock(&spinlock_dbus_init); | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_DBus_Quit(void) | void SDL_DBus_Quit(void) | ||||||
|   | |||||||
| @@ -416,7 +416,7 @@ static void kbd_vt_update(SDL_EVDEV_keyboard_state *state) | |||||||
|             } |             } | ||||||
|             ioctl(state->console_fd, VT_RELDISP, VT_ACKACQ); |             ioctl(state->console_fd, VT_RELDISP, VT_ACKACQ); | ||||||
|         } |         } | ||||||
|         SDL_AtomicCAS(&vt_signal_pending, signal_pending, VT_SIGNAL_NONE); |         SDL_AtomicCompareAndSwap(&vt_signal_pending, signal_pending, VT_SIGNAL_NONE); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -536,14 +536,14 @@ static void SDL_InitDynamicAPI(void) | |||||||
|     static SDL_bool already_initialized = SDL_FALSE; |     static SDL_bool already_initialized = SDL_FALSE; | ||||||
|  |  | ||||||
|     static SDL_SpinLock lock = 0; |     static SDL_SpinLock lock = 0; | ||||||
|     SDL_AtomicLock_REAL(&lock); |     SDL_LockSpinlock_REAL(&lock); | ||||||
|  |  | ||||||
|     if (!already_initialized) { |     if (!already_initialized) { | ||||||
|         SDL_InitDynamicAPILocked(); |         SDL_InitDynamicAPILocked(); | ||||||
|         already_initialized = SDL_TRUE; |         already_initialized = SDL_TRUE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_AtomicUnlock_REAL(&lock); |     SDL_UnlockSpinlock_REAL(&lock); | ||||||
| } | } | ||||||
|  |  | ||||||
| #else /* SDL_DYNAMIC_API */ | #else /* SDL_DYNAMIC_API */ | ||||||
|   | |||||||
| @@ -17,15 +17,15 @@ SDL3_0.0.0 { | |||||||
|     SDL_AndroidSendMessage; |     SDL_AndroidSendMessage; | ||||||
|     SDL_AndroidShowToast; |     SDL_AndroidShowToast; | ||||||
|     SDL_AtomicAdd; |     SDL_AtomicAdd; | ||||||
|     SDL_AtomicCAS; |     SDL_AtomicCompareAndSwap; | ||||||
|     SDL_AtomicCASPtr; |     SDL_AtomicCompareAndSwapPointer; | ||||||
|     SDL_AtomicGet; |     SDL_AtomicGet; | ||||||
|     SDL_AtomicGetPtr; |     SDL_AtomicGetPtr; | ||||||
|     SDL_AtomicLock; |     SDL_LockSpinlock; | ||||||
|     SDL_AtomicSet; |     SDL_AtomicSet; | ||||||
|     SDL_AtomicSetPtr; |     SDL_AtomicSetPtr; | ||||||
|     SDL_AtomicTryLock; |     SDL_TryLockSpinlock; | ||||||
|     SDL_AtomicUnlock; |     SDL_UnlockSpinlock; | ||||||
|     SDL_AttachVirtualJoystick; |     SDL_AttachVirtualJoystick; | ||||||
|     SDL_AttachVirtualJoystickEx; |     SDL_AttachVirtualJoystickEx; | ||||||
|     SDL_BlitSurface; |     SDL_BlitSurface; | ||||||
|   | |||||||
| @@ -41,15 +41,15 @@ | |||||||
| #define SDL_AndroidSendMessage  SDL_AndroidSendMessage_REAL | #define SDL_AndroidSendMessage  SDL_AndroidSendMessage_REAL | ||||||
| #define SDL_AndroidShowToast    SDL_AndroidShowToast_REAL | #define SDL_AndroidShowToast    SDL_AndroidShowToast_REAL | ||||||
| #define SDL_AtomicAdd SDL_AtomicAdd_REAL | #define SDL_AtomicAdd SDL_AtomicAdd_REAL | ||||||
| #define SDL_AtomicCAS SDL_AtomicCAS_REAL | #define SDL_AtomicCompareAndSwap SDL_AtomicCompareAndSwap_REAL | ||||||
| #define SDL_AtomicCASPtr SDL_AtomicCASPtr_REAL | #define SDL_AtomicCompareAndSwapPointer SDL_AtomicCompareAndSwapPointer_REAL | ||||||
| #define SDL_AtomicGet SDL_AtomicGet_REAL | #define SDL_AtomicGet SDL_AtomicGet_REAL | ||||||
| #define SDL_AtomicGetPtr SDL_AtomicGetPtr_REAL | #define SDL_AtomicGetPtr SDL_AtomicGetPtr_REAL | ||||||
| #define SDL_AtomicLock SDL_AtomicLock_REAL | #define SDL_LockSpinlock SDL_LockSpinlock_REAL | ||||||
| #define SDL_AtomicSet SDL_AtomicSet_REAL | #define SDL_AtomicSet SDL_AtomicSet_REAL | ||||||
| #define SDL_AtomicSetPtr SDL_AtomicSetPtr_REAL | #define SDL_AtomicSetPtr SDL_AtomicSetPtr_REAL | ||||||
| #define SDL_AtomicTryLock SDL_AtomicTryLock_REAL | #define SDL_TryLockSpinlock SDL_TryLockSpinlock_REAL | ||||||
| #define SDL_AtomicUnlock SDL_AtomicUnlock_REAL | #define SDL_UnlockSpinlock SDL_UnlockSpinlock_REAL | ||||||
| #define SDL_AttachVirtualJoystick SDL_AttachVirtualJoystick_REAL | #define SDL_AttachVirtualJoystick SDL_AttachVirtualJoystick_REAL | ||||||
| #define SDL_AttachVirtualJoystickEx SDL_AttachVirtualJoystickEx_REAL | #define SDL_AttachVirtualJoystickEx SDL_AttachVirtualJoystickEx_REAL | ||||||
| #define SDL_BlitSurface SDL_BlitSurface_REAL | #define SDL_BlitSurface SDL_BlitSurface_REAL | ||||||
|   | |||||||
| @@ -107,15 +107,15 @@ SDL_DYNAPI_PROC(int,SDL_AddGamepadMappingsFromRW,(SDL_RWops *a, SDL_bool b),(a,b | |||||||
| SDL_DYNAPI_PROC(int,SDL_AddHintCallback,(const char *a, SDL_HintCallback b, void *c),(a,b,c),return) | SDL_DYNAPI_PROC(int,SDL_AddHintCallback,(const char *a, SDL_HintCallback b, void *c),(a,b,c),return) | ||||||
| SDL_DYNAPI_PROC(SDL_TimerID,SDL_AddTimer,(Uint32 a, SDL_TimerCallback b, void *c),(a,b,c),return) | SDL_DYNAPI_PROC(SDL_TimerID,SDL_AddTimer,(Uint32 a, SDL_TimerCallback b, void *c),(a,b,c),return) | ||||||
| SDL_DYNAPI_PROC(int,SDL_AtomicAdd,(SDL_AtomicInt *a, int b),(a,b),return) | SDL_DYNAPI_PROC(int,SDL_AtomicAdd,(SDL_AtomicInt *a, int b),(a,b),return) | ||||||
| SDL_DYNAPI_PROC(SDL_bool,SDL_AtomicCAS,(SDL_AtomicInt *a, int b, int c),(a,b,c),return) | SDL_DYNAPI_PROC(SDL_bool,SDL_AtomicCompareAndSwap,(SDL_AtomicInt *a, int b, int c),(a,b,c),return) | ||||||
| SDL_DYNAPI_PROC(SDL_bool,SDL_AtomicCASPtr,(void **a, void *b, void *c),(a,b,c),return) | SDL_DYNAPI_PROC(SDL_bool,SDL_AtomicCompareAndSwapPointer,(void **a, void *b, void *c),(a,b,c),return) | ||||||
| SDL_DYNAPI_PROC(int,SDL_AtomicGet,(SDL_AtomicInt *a),(a),return) | SDL_DYNAPI_PROC(int,SDL_AtomicGet,(SDL_AtomicInt *a),(a),return) | ||||||
| SDL_DYNAPI_PROC(void*,SDL_AtomicGetPtr,(void **a),(a),return) | SDL_DYNAPI_PROC(void*,SDL_AtomicGetPtr,(void **a),(a),return) | ||||||
| SDL_DYNAPI_PROC(void,SDL_AtomicLock,(SDL_SpinLock *a),(a),) | SDL_DYNAPI_PROC(void,SDL_LockSpinlock,(SDL_SpinLock *a),(a),) | ||||||
| SDL_DYNAPI_PROC(int,SDL_AtomicSet,(SDL_AtomicInt *a, int b),(a,b),return) | SDL_DYNAPI_PROC(int,SDL_AtomicSet,(SDL_AtomicInt *a, int b),(a,b),return) | ||||||
| SDL_DYNAPI_PROC(void*,SDL_AtomicSetPtr,(void **a, void *b),(a,b),return) | SDL_DYNAPI_PROC(void*,SDL_AtomicSetPtr,(void **a, void *b),(a,b),return) | ||||||
| SDL_DYNAPI_PROC(SDL_bool,SDL_AtomicTryLock,(SDL_SpinLock *a),(a),return) | SDL_DYNAPI_PROC(SDL_bool,SDL_TryLockSpinlock,(SDL_SpinLock *a),(a),return) | ||||||
| SDL_DYNAPI_PROC(void,SDL_AtomicUnlock,(SDL_SpinLock *a),(a),) | SDL_DYNAPI_PROC(void,SDL_UnlockSpinlock,(SDL_SpinLock *a),(a),) | ||||||
| SDL_DYNAPI_PROC(SDL_JoystickID,SDL_AttachVirtualJoystick,(SDL_JoystickType a, int b, int c, int d),(a,b,c,d),return) | SDL_DYNAPI_PROC(SDL_JoystickID,SDL_AttachVirtualJoystick,(SDL_JoystickType a, int b, int c, int d),(a,b,c,d),return) | ||||||
| SDL_DYNAPI_PROC(SDL_JoystickID,SDL_AttachVirtualJoystickEx,(const SDL_VirtualJoystickDesc *a),(a),return) | SDL_DYNAPI_PROC(SDL_JoystickID,SDL_AttachVirtualJoystickEx,(const SDL_VirtualJoystickDesc *a),(a),return) | ||||||
| SDL_DYNAPI_PROC(int,SDL_BlitSurface,(SDL_Surface *a, const SDL_Rect *b, SDL_Surface *c, SDL_Rect *d),(a,b,c,d),return) | SDL_DYNAPI_PROC(int,SDL_BlitSurface,(SDL_Surface *a, const SDL_Rect *b, SDL_Surface *c, SDL_Rect *d),(a,b,c,d),return) | ||||||
|   | |||||||
| @@ -168,7 +168,7 @@ int SDL_HIDAPI_LockRumble(void) | |||||||
| { | { | ||||||
|     SDL_HIDAPI_RumbleContext *ctx = &rumble_context; |     SDL_HIDAPI_RumbleContext *ctx = &rumble_context; | ||||||
|  |  | ||||||
|     if (SDL_AtomicCAS(&ctx->initialized, SDL_FALSE, SDL_TRUE)) { |     if (SDL_AtomicCompareAndSwap(&ctx->initialized, SDL_FALSE, SDL_TRUE)) { | ||||||
|         if (SDL_HIDAPI_StartRumbleThread(ctx) < 0) { |         if (SDL_HIDAPI_StartRumbleThread(ctx) < 0) { | ||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -1206,9 +1206,9 @@ SDL_bool HIDAPI_IsDeviceTypePresent(SDL_GamepadType type) | |||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (SDL_AtomicTryLock(&SDL_HIDAPI_spinlock)) { |     if (SDL_TryLockSpinlock(&SDL_HIDAPI_spinlock)) { | ||||||
|         HIDAPI_UpdateDeviceList(); |         HIDAPI_UpdateDeviceList(); | ||||||
|         SDL_AtomicUnlock(&SDL_HIDAPI_spinlock); |         SDL_UnlockSpinlock(&SDL_HIDAPI_spinlock); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_LockJoysticks(); |     SDL_LockJoysticks(); | ||||||
| @@ -1251,9 +1251,9 @@ SDL_bool HIDAPI_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 vers | |||||||
|     } |     } | ||||||
| #endif /* SDL_JOYSTICK_HIDAPI_XBOX360 || SDL_JOYSTICK_HIDAPI_XBOXONE */ | #endif /* SDL_JOYSTICK_HIDAPI_XBOX360 || SDL_JOYSTICK_HIDAPI_XBOXONE */ | ||||||
|     if (supported) { |     if (supported) { | ||||||
|         if (SDL_AtomicTryLock(&SDL_HIDAPI_spinlock)) { |         if (SDL_TryLockSpinlock(&SDL_HIDAPI_spinlock)) { | ||||||
|             HIDAPI_UpdateDeviceList(); |             HIDAPI_UpdateDeviceList(); | ||||||
|             SDL_AtomicUnlock(&SDL_HIDAPI_spinlock); |             SDL_UnlockSpinlock(&SDL_HIDAPI_spinlock); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1313,13 +1313,13 @@ SDL_GamepadType HIDAPI_GetGamepadTypeFromGUID(SDL_JoystickGUID guid) | |||||||
|  |  | ||||||
| static void HIDAPI_JoystickDetect(void) | static void HIDAPI_JoystickDetect(void) | ||||||
| { | { | ||||||
|     if (SDL_AtomicTryLock(&SDL_HIDAPI_spinlock)) { |     if (SDL_TryLockSpinlock(&SDL_HIDAPI_spinlock)) { | ||||||
|         Uint32 count = SDL_hid_device_change_count(); |         Uint32 count = SDL_hid_device_change_count(); | ||||||
|         if (SDL_HIDAPI_change_count != count) { |         if (SDL_HIDAPI_change_count != count) { | ||||||
|             SDL_HIDAPI_change_count = count; |             SDL_HIDAPI_change_count = count; | ||||||
|             HIDAPI_UpdateDeviceList(); |             HIDAPI_UpdateDeviceList(); | ||||||
|         } |         } | ||||||
|         SDL_AtomicUnlock(&SDL_HIDAPI_spinlock); |         SDL_UnlockSpinlock(&SDL_HIDAPI_spinlock); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1332,7 +1332,7 @@ void HIDAPI_UpdateDevices(void) | |||||||
|     /* Update the devices, which may change connected joysticks and send events */ |     /* Update the devices, which may change connected joysticks and send events */ | ||||||
|  |  | ||||||
|     /* Prepare the existing device list */ |     /* Prepare the existing device list */ | ||||||
|     if (SDL_AtomicTryLock(&SDL_HIDAPI_spinlock)) { |     if (SDL_TryLockSpinlock(&SDL_HIDAPI_spinlock)) { | ||||||
|         for (device = SDL_HIDAPI_devices; device; device = device->next) { |         for (device = SDL_HIDAPI_devices; device; device = device->next) { | ||||||
|             if (device->parent) { |             if (device->parent) { | ||||||
|                 continue; |                 continue; | ||||||
| @@ -1346,7 +1346,7 @@ void HIDAPI_UpdateDevices(void) | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         SDL_AtomicUnlock(&SDL_HIDAPI_spinlock); |         SDL_UnlockSpinlock(&SDL_HIDAPI_spinlock); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -46,7 +46,7 @@ static SDL_bool ShouldDispatchImmediately(SDL_Event *event) | |||||||
| static void SDL_DispatchMainCallbackEvent(SDL_Event *event) | static void SDL_DispatchMainCallbackEvent(SDL_Event *event) | ||||||
| { | { | ||||||
|     if (SDL_AtomicGet(&apprc) == 0) { // if already quitting, don't send the event to the app. |     if (SDL_AtomicGet(&apprc) == 0) { // if already quitting, don't send the event to the app. | ||||||
|         SDL_AtomicCAS(&apprc, 0, SDL_main_event_callback(event)); |         SDL_AtomicCompareAndSwap(&apprc, 0, SDL_main_event_callback(event)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -96,7 +96,7 @@ int SDL_InitMainCallbacks(int argc, char* argv[], SDL_AppInit_func appinit, SDL_ | |||||||
|     SDL_AtomicSet(&apprc, 0); |     SDL_AtomicSet(&apprc, 0); | ||||||
|  |  | ||||||
|     const int rc = appinit(argc, argv); |     const int rc = appinit(argc, argv); | ||||||
|     if (SDL_AtomicCAS(&apprc, 0, rc) && (rc == 0)) {  // bounce if SDL_AppInit already said abort, otherwise... |     if (SDL_AtomicCompareAndSwap(&apprc, 0, rc) && (rc == 0)) {  // bounce if SDL_AppInit already said abort, otherwise... | ||||||
|         // make sure we definitely have events initialized, even if the app didn't do it. |         // make sure we definitely have events initialized, even if the app didn't do it. | ||||||
|         if (SDL_InitSubSystem(SDL_INIT_EVENTS) == -1) { |         if (SDL_InitSubSystem(SDL_INIT_EVENTS) == -1) { | ||||||
|             SDL_AtomicSet(&apprc, -1); |             SDL_AtomicSet(&apprc, -1); | ||||||
| @@ -122,7 +122,7 @@ int SDL_IterateMainCallbacks(SDL_bool pump_events) | |||||||
|     int rc = SDL_AtomicGet(&apprc); |     int rc = SDL_AtomicGet(&apprc); | ||||||
|     if (rc == 0) { |     if (rc == 0) { | ||||||
|         rc = SDL_main_iteration_callback(); |         rc = SDL_main_iteration_callback(); | ||||||
|         if (!SDL_AtomicCAS(&apprc, 0, rc)) { |         if (!SDL_AtomicCompareAndSwap(&apprc, 0, rc)) { | ||||||
|             rc = SDL_AtomicGet(&apprc); // something else already set a quit result, keep that. |             rc = SDL_AtomicGet(&apprc); // something else already set a quit result, keep that. | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -122,17 +122,17 @@ SDL_TLSData *SDL_Generic_GetTLSData(void) | |||||||
| #ifndef SDL_THREADS_DISABLED | #ifndef SDL_THREADS_DISABLED | ||||||
|     if (!SDL_generic_TLS_mutex) { |     if (!SDL_generic_TLS_mutex) { | ||||||
|         static SDL_SpinLock tls_lock; |         static SDL_SpinLock tls_lock; | ||||||
|         SDL_AtomicLock(&tls_lock); |         SDL_LockSpinlock(&tls_lock); | ||||||
|         if (!SDL_generic_TLS_mutex) { |         if (!SDL_generic_TLS_mutex) { | ||||||
|             SDL_Mutex *mutex = SDL_CreateMutex(); |             SDL_Mutex *mutex = SDL_CreateMutex(); | ||||||
|             SDL_MemoryBarrierRelease(); |             SDL_MemoryBarrierRelease(); | ||||||
|             SDL_generic_TLS_mutex = mutex; |             SDL_generic_TLS_mutex = mutex; | ||||||
|             if (!SDL_generic_TLS_mutex) { |             if (!SDL_generic_TLS_mutex) { | ||||||
|                 SDL_AtomicUnlock(&tls_lock); |                 SDL_UnlockSpinlock(&tls_lock); | ||||||
|                 return NULL; |                 return NULL; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         SDL_AtomicUnlock(&tls_lock); |         SDL_UnlockSpinlock(&tls_lock); | ||||||
|     } |     } | ||||||
|     SDL_MemoryBarrierAcquire(); |     SDL_MemoryBarrierAcquire(); | ||||||
|     SDL_LockMutex(SDL_generic_TLS_mutex); |     SDL_LockMutex(SDL_generic_TLS_mutex); | ||||||
| @@ -232,7 +232,7 @@ SDL_error *SDL_GetErrBuf(SDL_bool create) | |||||||
|        but that's very unlikely and hopefully won't cause issues. |        but that's very unlikely and hopefully won't cause issues. | ||||||
|      */ |      */ | ||||||
|     if (!tls_errbuf && !tls_being_created) { |     if (!tls_errbuf && !tls_being_created) { | ||||||
|         SDL_AtomicLock(&tls_lock); |         SDL_LockSpinlock(&tls_lock); | ||||||
|         if (!tls_errbuf) { |         if (!tls_errbuf) { | ||||||
|             SDL_TLSID slot; |             SDL_TLSID slot; | ||||||
|             tls_being_created = SDL_TRUE; |             tls_being_created = SDL_TRUE; | ||||||
| @@ -241,7 +241,7 @@ SDL_error *SDL_GetErrBuf(SDL_bool create) | |||||||
|             SDL_MemoryBarrierRelease(); |             SDL_MemoryBarrierRelease(); | ||||||
|             tls_errbuf = slot; |             tls_errbuf = slot; | ||||||
|         } |         } | ||||||
|         SDL_AtomicUnlock(&tls_lock); |         SDL_UnlockSpinlock(&tls_lock); | ||||||
|     } |     } | ||||||
|     if (!tls_errbuf) { |     if (!tls_errbuf) { | ||||||
|         return SDL_GetStaticErrBuf(); |         return SDL_GetStaticErrBuf(); | ||||||
| @@ -296,9 +296,9 @@ void SDL_RunThread(SDL_Thread *thread) | |||||||
|     SDL_CleanupTLS(); |     SDL_CleanupTLS(); | ||||||
|  |  | ||||||
|     /* Mark us as ready to be joined (or detached) */ |     /* Mark us as ready to be joined (or detached) */ | ||||||
|     if (!SDL_AtomicCAS(&thread->state, SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_ZOMBIE)) { |     if (!SDL_AtomicCompareAndSwap(&thread->state, SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_ZOMBIE)) { | ||||||
|         /* Clean up if something already detached us. */ |         /* Clean up if something already detached us. */ | ||||||
|         if (SDL_AtomicCAS(&thread->state, SDL_THREAD_STATE_DETACHED, SDL_THREAD_STATE_CLEANED)) { |         if (SDL_AtomicCompareAndSwap(&thread->state, SDL_THREAD_STATE_DETACHED, SDL_THREAD_STATE_CLEANED)) { | ||||||
|             if (thread->name) { |             if (thread->name) { | ||||||
|                 SDL_free(thread->name); |                 SDL_free(thread->name); | ||||||
|             } |             } | ||||||
| @@ -456,7 +456,7 @@ void SDL_DetachThread(SDL_Thread *thread) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Grab dibs if the state is alive+joinable. */ |     /* Grab dibs if the state is alive+joinable. */ | ||||||
|     if (SDL_AtomicCAS(&thread->state, SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_DETACHED)) { |     if (SDL_AtomicCompareAndSwap(&thread->state, SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_DETACHED)) { | ||||||
|         SDL_SYS_DetachThread(thread); |         SDL_SYS_DetachThread(thread); | ||||||
|     } else { |     } else { | ||||||
|         /* all other states are pretty final, see where we landed. */ |         /* all other states are pretty final, see where we landed. */ | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ SDL_TLSData *SDL_SYS_GetTLSData(void) | |||||||
| { | { | ||||||
|     if (thread_local_storage == INVALID_PTHREAD_KEY && !generic_local_storage) { |     if (thread_local_storage == INVALID_PTHREAD_KEY && !generic_local_storage) { | ||||||
|         static SDL_SpinLock lock; |         static SDL_SpinLock lock; | ||||||
|         SDL_AtomicLock(&lock); |         SDL_LockSpinlock(&lock); | ||||||
|         if (thread_local_storage == INVALID_PTHREAD_KEY && !generic_local_storage) { |         if (thread_local_storage == INVALID_PTHREAD_KEY && !generic_local_storage) { | ||||||
|             pthread_key_t storage; |             pthread_key_t storage; | ||||||
|             if (pthread_key_create(&storage, NULL) == 0) { |             if (pthread_key_create(&storage, NULL) == 0) { | ||||||
| @@ -43,7 +43,7 @@ SDL_TLSData *SDL_SYS_GetTLSData(void) | |||||||
|                 generic_local_storage = SDL_TRUE; |                 generic_local_storage = SDL_TRUE; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         SDL_AtomicUnlock(&lock); |         SDL_UnlockSpinlock(&lock); | ||||||
|     } |     } | ||||||
|     if (generic_local_storage) { |     if (generic_local_storage) { | ||||||
|         return SDL_Generic_GetTLSData(); |         return SDL_Generic_GetTLSData(); | ||||||
|   | |||||||
| @@ -46,7 +46,7 @@ SDL_TLSData *SDL_SYS_GetTLSData(void) | |||||||
| { | { | ||||||
|     if (thread_local_storage == TLS_OUT_OF_INDEXES && !generic_local_storage) { |     if (thread_local_storage == TLS_OUT_OF_INDEXES && !generic_local_storage) { | ||||||
|         static SDL_SpinLock lock; |         static SDL_SpinLock lock; | ||||||
|         SDL_AtomicLock(&lock); |         SDL_LockSpinlock(&lock); | ||||||
|         if (thread_local_storage == TLS_OUT_OF_INDEXES && !generic_local_storage) { |         if (thread_local_storage == TLS_OUT_OF_INDEXES && !generic_local_storage) { | ||||||
|             DWORD storage = TlsAlloc(); |             DWORD storage = TlsAlloc(); | ||||||
|             if (storage != TLS_OUT_OF_INDEXES) { |             if (storage != TLS_OUT_OF_INDEXES) { | ||||||
| @@ -56,7 +56,7 @@ SDL_TLSData *SDL_SYS_GetTLSData(void) | |||||||
|                 generic_local_storage = SDL_TRUE; |                 generic_local_storage = SDL_TRUE; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         SDL_AtomicUnlock(&lock); |         SDL_UnlockSpinlock(&lock); | ||||||
|     } |     } | ||||||
|     if (generic_local_storage) { |     if (generic_local_storage) { | ||||||
|         return SDL_Generic_GetTLSData(); |         return SDL_Generic_GetTLSData(); | ||||||
|   | |||||||
| @@ -112,7 +112,7 @@ static int SDLCALL SDL_TimerThread(void *_data) | |||||||
|      */ |      */ | ||||||
|     for (;;) { |     for (;;) { | ||||||
|         /* Pending and freelist maintenance */ |         /* Pending and freelist maintenance */ | ||||||
|         SDL_AtomicLock(&data->lock); |         SDL_LockSpinlock(&data->lock); | ||||||
|         { |         { | ||||||
|             /* Get any timers ready to be queued */ |             /* Get any timers ready to be queued */ | ||||||
|             pending = data->pending; |             pending = data->pending; | ||||||
| @@ -124,7 +124,7 @@ static int SDLCALL SDL_TimerThread(void *_data) | |||||||
|                 data->freelist = freelist_head; |                 data->freelist = freelist_head; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         SDL_AtomicUnlock(&data->lock); |         SDL_UnlockSpinlock(&data->lock); | ||||||
|  |  | ||||||
|         /* Sort the pending timers into our list */ |         /* Sort the pending timers into our list */ | ||||||
|         while (pending) { |         while (pending) { | ||||||
| @@ -239,7 +239,7 @@ void SDL_QuitTimers(void) | |||||||
|     SDL_Timer *timer; |     SDL_Timer *timer; | ||||||
|     SDL_TimerMap *entry; |     SDL_TimerMap *entry; | ||||||
|  |  | ||||||
|     if (SDL_AtomicCAS(&data->active, 1, 0)) { /* active? Move to inactive. */ |     if (SDL_AtomicCompareAndSwap(&data->active, 1, 0)) { /* active? Move to inactive. */ | ||||||
|         /* Shutdown the timer thread */ |         /* Shutdown the timer thread */ | ||||||
|         if (data->thread) { |         if (data->thread) { | ||||||
|             SDL_PostSemaphore(data->sem); |             SDL_PostSemaphore(data->sem); | ||||||
| @@ -278,10 +278,10 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *para | |||||||
|     SDL_Timer *timer; |     SDL_Timer *timer; | ||||||
|     SDL_TimerMap *entry; |     SDL_TimerMap *entry; | ||||||
|  |  | ||||||
|     SDL_AtomicLock(&data->lock); |     SDL_LockSpinlock(&data->lock); | ||||||
|     if (!SDL_AtomicGet(&data->active)) { |     if (!SDL_AtomicGet(&data->active)) { | ||||||
|         if (SDL_InitTimers() < 0) { |         if (SDL_InitTimers() < 0) { | ||||||
|             SDL_AtomicUnlock(&data->lock); |             SDL_UnlockSpinlock(&data->lock); | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -290,7 +290,7 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *para | |||||||
|     if (timer) { |     if (timer) { | ||||||
|         data->freelist = timer->next; |         data->freelist = timer->next; | ||||||
|     } |     } | ||||||
|     SDL_AtomicUnlock(&data->lock); |     SDL_UnlockSpinlock(&data->lock); | ||||||
|  |  | ||||||
|     if (timer) { |     if (timer) { | ||||||
|         SDL_RemoveTimer(timer->timerID); |         SDL_RemoveTimer(timer->timerID); | ||||||
| @@ -321,10 +321,10 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *para | |||||||
|     SDL_UnlockMutex(data->timermap_lock); |     SDL_UnlockMutex(data->timermap_lock); | ||||||
|  |  | ||||||
|     /* Add the timer to the pending list for the timer thread */ |     /* Add the timer to the pending list for the timer thread */ | ||||||
|     SDL_AtomicLock(&data->lock); |     SDL_LockSpinlock(&data->lock); | ||||||
|     timer->next = data->pending; |     timer->next = data->pending; | ||||||
|     data->pending = timer; |     data->pending = timer; | ||||||
|     SDL_AtomicUnlock(&data->lock); |     SDL_UnlockSpinlock(&data->lock); | ||||||
|  |  | ||||||
|     /* Wake up the timer thread if necessary */ |     /* Wake up the timer thread if necessary */ | ||||||
|     SDL_PostSemaphore(data->sem); |     SDL_PostSemaphore(data->sem); | ||||||
|   | |||||||
| @@ -550,13 +550,13 @@ SDL_PixelFormat *SDL_CreatePixelFormat(Uint32 pixel_format) | |||||||
| { | { | ||||||
|     SDL_PixelFormat *format; |     SDL_PixelFormat *format; | ||||||
|  |  | ||||||
|     SDL_AtomicLock(&formats_lock); |     SDL_LockSpinlock(&formats_lock); | ||||||
|  |  | ||||||
|     /* Look it up in our list of previously allocated formats */ |     /* Look it up in our list of previously allocated formats */ | ||||||
|     for (format = formats; format; format = format->next) { |     for (format = formats; format; format = format->next) { | ||||||
|         if (pixel_format == format->format) { |         if (pixel_format == format->format) { | ||||||
|             ++format->refcount; |             ++format->refcount; | ||||||
|             SDL_AtomicUnlock(&formats_lock); |             SDL_UnlockSpinlock(&formats_lock); | ||||||
|             return format; |             return format; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -564,11 +564,11 @@ SDL_PixelFormat *SDL_CreatePixelFormat(Uint32 pixel_format) | |||||||
|     /* Allocate an empty pixel format structure, and initialize it */ |     /* Allocate an empty pixel format structure, and initialize it */ | ||||||
|     format = SDL_malloc(sizeof(*format)); |     format = SDL_malloc(sizeof(*format)); | ||||||
|     if (!format) { |     if (!format) { | ||||||
|         SDL_AtomicUnlock(&formats_lock); |         SDL_UnlockSpinlock(&formats_lock); | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|     if (SDL_InitFormat(format, pixel_format) < 0) { |     if (SDL_InitFormat(format, pixel_format) < 0) { | ||||||
|         SDL_AtomicUnlock(&formats_lock); |         SDL_UnlockSpinlock(&formats_lock); | ||||||
|         SDL_free(format); |         SDL_free(format); | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
| @@ -579,7 +579,7 @@ SDL_PixelFormat *SDL_CreatePixelFormat(Uint32 pixel_format) | |||||||
|         formats = format; |         formats = format; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_AtomicUnlock(&formats_lock); |     SDL_UnlockSpinlock(&formats_lock); | ||||||
|  |  | ||||||
|     return format; |     return format; | ||||||
| } | } | ||||||
| @@ -664,10 +664,10 @@ void SDL_DestroyPixelFormat(SDL_PixelFormat *format) | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_AtomicLock(&formats_lock); |     SDL_LockSpinlock(&formats_lock); | ||||||
|  |  | ||||||
|     if (--format->refcount > 0) { |     if (--format->refcount > 0) { | ||||||
|         SDL_AtomicUnlock(&formats_lock); |         SDL_UnlockSpinlock(&formats_lock); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -683,7 +683,7 @@ void SDL_DestroyPixelFormat(SDL_PixelFormat *format) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_AtomicUnlock(&formats_lock); |     SDL_UnlockSpinlock(&formats_lock); | ||||||
|  |  | ||||||
|     if (format->palette) { |     if (format->palette) { | ||||||
|         SDL_DestroyPalette(format->palette); |         SDL_DestroyPalette(format->palette); | ||||||
|   | |||||||
| @@ -42,9 +42,9 @@ static void RunBasicTest(void) | |||||||
|  |  | ||||||
|     SDL_Log("\nspin lock---------------------------------------\n\n"); |     SDL_Log("\nspin lock---------------------------------------\n\n"); | ||||||
|  |  | ||||||
|     SDL_AtomicLock(&lock); |     SDL_LockSpinlock(&lock); | ||||||
|     SDL_Log("AtomicLock                   lock=%d\n", lock); |     SDL_Log("AtomicLock                   lock=%d\n", lock); | ||||||
|     SDL_AtomicUnlock(&lock); |     SDL_UnlockSpinlock(&lock); | ||||||
|     SDL_Log("AtomicUnlock                 lock=%d\n", lock); |     SDL_Log("AtomicUnlock                 lock=%d\n", lock); | ||||||
|  |  | ||||||
|     SDL_Log("\natomic -----------------------------------------\n\n"); |     SDL_Log("\natomic -----------------------------------------\n\n"); | ||||||
| @@ -68,10 +68,10 @@ static void RunBasicTest(void) | |||||||
|     SDL_Log("AtomicDecRef()       tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |     SDL_Log("AtomicDecRef()       tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); | ||||||
|  |  | ||||||
|     SDL_AtomicSet(&v, 10); |     SDL_AtomicSet(&v, 10); | ||||||
|     tfret = (SDL_AtomicCAS(&v, 0, 20) == SDL_FALSE); |     tfret = (SDL_AtomicCompareAndSwap(&v, 0, 20) == SDL_FALSE); | ||||||
|     SDL_Log("AtomicCAS()          tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |     SDL_Log("AtomicCAS()          tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); | ||||||
|     value = SDL_AtomicGet(&v); |     value = SDL_AtomicGet(&v); | ||||||
|     tfret = (SDL_AtomicCAS(&v, value, 20) == SDL_TRUE); |     tfret = (SDL_AtomicCompareAndSwap(&v, value, 20) == SDL_TRUE); | ||||||
|     SDL_Log("AtomicCAS()          tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |     SDL_Log("AtomicCAS()          tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -179,12 +179,12 @@ static void RunEpicTest(void) | |||||||
|  |  | ||||||
|     SDL_Log("Test compare and exchange\n"); |     SDL_Log("Test compare and exchange\n"); | ||||||
|  |  | ||||||
|     b = SDL_AtomicCAS(&good, 500, 43); |     b = SDL_AtomicCompareAndSwap(&good, 500, 43); | ||||||
|     SDL_assert(!b); /* no swap since CountTo!=500 */ |     SDL_assert(!b); /* no swap since CountTo!=500 */ | ||||||
|     v = SDL_AtomicGet(&good); |     v = SDL_AtomicGet(&good); | ||||||
|     SDL_assert(v == CountTo); /* ensure no swap */ |     SDL_assert(v == CountTo); /* ensure no swap */ | ||||||
|  |  | ||||||
|     b = SDL_AtomicCAS(&good, CountTo, 44); |     b = SDL_AtomicCompareAndSwap(&good, CountTo, 44); | ||||||
|     SDL_assert(!!b); /* will swap */ |     SDL_assert(!!b); /* will swap */ | ||||||
|     v = SDL_AtomicGet(&good); |     v = SDL_AtomicGet(&good); | ||||||
|     SDL_assert(v == 44); |     SDL_assert(v == 44); | ||||||
| @@ -317,10 +317,10 @@ static SDL_bool EnqueueEvent_LockFree(SDL_EventQueue *queue, const SDL_Event *ev | |||||||
|  |  | ||||||
| #ifdef TEST_SPINLOCK_FIFO | #ifdef TEST_SPINLOCK_FIFO | ||||||
|     /* This is a gate so an external thread can lock the queue */ |     /* This is a gate so an external thread can lock the queue */ | ||||||
|     SDL_AtomicLock(&queue->lock); |     SDL_LockSpinlock(&queue->lock); | ||||||
|     SDL_assert(SDL_AtomicGet(&queue->watcher) == 0); |     SDL_assert(SDL_AtomicGet(&queue->watcher) == 0); | ||||||
|     SDL_AtomicIncRef(&queue->rwcount); |     SDL_AtomicIncRef(&queue->rwcount); | ||||||
|     SDL_AtomicUnlock(&queue->lock); |     SDL_UnlockSpinlock(&queue->lock); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     queue_pos = (unsigned)SDL_AtomicGet(&queue->enqueue_pos); |     queue_pos = (unsigned)SDL_AtomicGet(&queue->enqueue_pos); | ||||||
| @@ -331,7 +331,7 @@ static SDL_bool EnqueueEvent_LockFree(SDL_EventQueue *queue, const SDL_Event *ev | |||||||
|         delta = (int)(entry_seq - queue_pos); |         delta = (int)(entry_seq - queue_pos); | ||||||
|         if (delta == 0) { |         if (delta == 0) { | ||||||
|             /* The entry and the queue position match, try to increment the queue position */ |             /* The entry and the queue position match, try to increment the queue position */ | ||||||
|             if (SDL_AtomicCAS(&queue->enqueue_pos, (int)queue_pos, (int)(queue_pos + 1))) { |             if (SDL_AtomicCompareAndSwap(&queue->enqueue_pos, (int)queue_pos, (int)(queue_pos + 1))) { | ||||||
|                 /* We own the object, fill it! */ |                 /* We own the object, fill it! */ | ||||||
|                 entry->event = *event; |                 entry->event = *event; | ||||||
|                 SDL_AtomicSet(&entry->sequence, (int)(queue_pos + 1)); |                 SDL_AtomicSet(&entry->sequence, (int)(queue_pos + 1)); | ||||||
| @@ -364,10 +364,10 @@ static SDL_bool DequeueEvent_LockFree(SDL_EventQueue *queue, SDL_Event *event) | |||||||
|  |  | ||||||
| #ifdef TEST_SPINLOCK_FIFO | #ifdef TEST_SPINLOCK_FIFO | ||||||
|     /* This is a gate so an external thread can lock the queue */ |     /* This is a gate so an external thread can lock the queue */ | ||||||
|     SDL_AtomicLock(&queue->lock); |     SDL_LockSpinlock(&queue->lock); | ||||||
|     SDL_assert(SDL_AtomicGet(&queue->watcher) == 0); |     SDL_assert(SDL_AtomicGet(&queue->watcher) == 0); | ||||||
|     SDL_AtomicIncRef(&queue->rwcount); |     SDL_AtomicIncRef(&queue->rwcount); | ||||||
|     SDL_AtomicUnlock(&queue->lock); |     SDL_UnlockSpinlock(&queue->lock); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     queue_pos = (unsigned)SDL_AtomicGet(&queue->dequeue_pos); |     queue_pos = (unsigned)SDL_AtomicGet(&queue->dequeue_pos); | ||||||
| @@ -378,7 +378,7 @@ static SDL_bool DequeueEvent_LockFree(SDL_EventQueue *queue, SDL_Event *event) | |||||||
|         delta = (int)(entry_seq - (queue_pos + 1)); |         delta = (int)(entry_seq - (queue_pos + 1)); | ||||||
|         if (delta == 0) { |         if (delta == 0) { | ||||||
|             /* The entry and the queue position match, try to increment the queue position */ |             /* The entry and the queue position match, try to increment the queue position */ | ||||||
|             if (SDL_AtomicCAS(&queue->dequeue_pos, (int)queue_pos, (int)(queue_pos + 1))) { |             if (SDL_AtomicCompareAndSwap(&queue->dequeue_pos, (int)queue_pos, (int)(queue_pos + 1))) { | ||||||
|                 /* We own the object, fill it! */ |                 /* We own the object, fill it! */ | ||||||
|                 *event = entry->event; |                 *event = entry->event; | ||||||
|                 SDL_AtomicSet(&entry->sequence, (int)(queue_pos + MAX_ENTRIES)); |                 SDL_AtomicSet(&entry->sequence, (int)(queue_pos + MAX_ENTRIES)); | ||||||
| @@ -564,14 +564,14 @@ static int SDLCALL FIFO_Watcher(void *_data) | |||||||
|     SDL_EventQueue *queue = (SDL_EventQueue *)_data; |     SDL_EventQueue *queue = (SDL_EventQueue *)_data; | ||||||
|  |  | ||||||
|     while (SDL_AtomicGet(&queue->active)) { |     while (SDL_AtomicGet(&queue->active)) { | ||||||
|         SDL_AtomicLock(&queue->lock); |         SDL_LockSpinlock(&queue->lock); | ||||||
|         SDL_AtomicIncRef(&queue->watcher); |         SDL_AtomicIncRef(&queue->watcher); | ||||||
|         while (SDL_AtomicGet(&queue->rwcount) > 0) { |         while (SDL_AtomicGet(&queue->rwcount) > 0) { | ||||||
|             SDL_Delay(0); |             SDL_Delay(0); | ||||||
|         } |         } | ||||||
|         /* Do queue manipulation here... */ |         /* Do queue manipulation here... */ | ||||||
|         (void)SDL_AtomicDecRef(&queue->watcher); |         (void)SDL_AtomicDecRef(&queue->watcher); | ||||||
|         SDL_AtomicUnlock(&queue->lock); |         SDL_UnlockSpinlock(&queue->lock); | ||||||
|  |  | ||||||
|         /* Wait a bit... */ |         /* Wait a bit... */ | ||||||
|         SDL_Delay(1); |         SDL_Delay(1); | ||||||
|   | |||||||
| @@ -567,7 +567,7 @@ render_thread_fn(void *render_ctx) | |||||||
|     thread_data *thread = render_ctx; |     thread_data *thread = render_ctx; | ||||||
|  |  | ||||||
|     while (!done && !thread->done && state->windows[thread->index]) { |     while (!done && !thread->done && state->windows[thread->index]) { | ||||||
|         if (SDL_AtomicCAS(&thread->suspended, WAIT_STATE_ENTER_SEM, WAIT_STATE_WAITING_ON_SEM)) { |         if (SDL_AtomicCompareAndSwap(&thread->suspended, WAIT_STATE_ENTER_SEM, WAIT_STATE_WAITING_ON_SEM)) { | ||||||
|             SDL_WaitSemaphore(thread->suspend_sem); |             SDL_WaitSemaphore(thread->suspend_sem); | ||||||
|         } |         } | ||||||
|         render_window(thread->index); |         render_window(thread->index); | ||||||
| @@ -602,7 +602,7 @@ loop_threaded(void) | |||||||
|         if (suspend_when_occluded && event.type == SDL_EVENT_WINDOW_OCCLUDED) { |         if (suspend_when_occluded && event.type == SDL_EVENT_WINDOW_OCCLUDED) { | ||||||
|             tdata = GetThreadDataForWindow(event.window.windowID); |             tdata = GetThreadDataForWindow(event.window.windowID); | ||||||
|             if (tdata) { |             if (tdata) { | ||||||
|                 SDL_AtomicCAS(&tdata->suspended, WAIT_STATE_GO, WAIT_STATE_ENTER_SEM); |                 SDL_AtomicCompareAndSwap(&tdata->suspended, WAIT_STATE_GO, WAIT_STATE_ENTER_SEM); | ||||||
|             } |             } | ||||||
|         } else if (suspend_when_occluded && event.type == SDL_EVENT_WINDOW_EXPOSED) { |         } else if (suspend_when_occluded && event.type == SDL_EVENT_WINDOW_EXPOSED) { | ||||||
|             tdata = GetThreadDataForWindow(event.window.windowID); |             tdata = GetThreadDataForWindow(event.window.windowID); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sam Lantinga
					Sam Lantinga