mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-10-15 14:26:01 +00:00
thread: Locking mutexes and rwlocks are now void functions.
Almost nothing checks these return values, and there's no reason a valid lock should fail to operate. The cases where a lock isn't valid (it's a bogus pointer, it was previously destroyed, a thread is unlocking a lock it doesn't own, etc) are undefined behavior and always were, and should be treated as an application bug. Reference Issue #8096.
This commit is contained in:
@@ -27,74 +27,51 @@ extern "C" {
|
||||
#include <system_error>
|
||||
|
||||
#include "SDL_sysmutex_c.h"
|
||||
#include <Windows.h>
|
||||
#include <windows.h>
|
||||
|
||||
/* Create a mutex */
|
||||
extern "C" SDL_Mutex *
|
||||
SDL_CreateMutex(void)
|
||||
extern "C" SDL_Mutex * SDL_CreateMutex(void)
|
||||
{
|
||||
/* Allocate and initialize the mutex */
|
||||
// Allocate and initialize the mutex
|
||||
try {
|
||||
SDL_Mutex *mutex = new SDL_Mutex;
|
||||
return mutex;
|
||||
} catch (std::system_error &ex) {
|
||||
SDL_SetError("unable to create a C++ mutex: code=%d; %s", ex.code(), ex.what());
|
||||
return NULL;
|
||||
} catch (std::bad_alloc &) {
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Free the mutex */
|
||||
extern "C" void
|
||||
SDL_DestroyMutex(SDL_Mutex *mutex)
|
||||
extern "C" void SDL_DestroyMutex(SDL_Mutex *mutex)
|
||||
{
|
||||
if (mutex != NULL) {
|
||||
delete mutex;
|
||||
}
|
||||
}
|
||||
|
||||
/* Lock the mutex */
|
||||
extern "C" int
|
||||
SDL_LockMutex(SDL_Mutex *mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
||||
extern "C" void SDL_LockMutex(SDL_Mutex *mutex) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
if (mutex == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
try {
|
||||
mutex->cpp_mutex.lock();
|
||||
return 0;
|
||||
} catch (std::system_error &ex) {
|
||||
return SDL_SetError("unable to lock a C++ mutex: code=%d; %s", ex.code(), ex.what());
|
||||
if (mutex != NULL) {
|
||||
try {
|
||||
mutex->cpp_mutex.lock();
|
||||
} catch (std::system_error &ex) {
|
||||
SDL_assert(!"Error trying to lock mutex"); // assume we're in a lot of trouble if this assert fails.
|
||||
//return SDL_SetError("unable to lock a C++ mutex: code=%d; %s", ex.code(), ex.what());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* TryLock the mutex */
|
||||
int SDL_TryLockMutex(SDL_Mutex *mutex)
|
||||
extern "C" int SDL_TryLockMutex(SDL_Mutex *mutex)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
if (mutex == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mutex->cpp_mutex.try_lock() == false) {
|
||||
retval = SDL_MUTEX_TIMEDOUT;
|
||||
}
|
||||
return retval;
|
||||
return ((mutex == NULL) || mutex->cpp_mutex.try_lock()) ? 0 : SDL_MUTEX_TIMEDOUT;
|
||||
}
|
||||
|
||||
/* Unlock the mutex */
|
||||
extern "C" int
|
||||
SDL_UnlockMutex(SDL_Mutex *mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
||||
extern "C" void SDL_UnlockMutex(SDL_Mutex *mutex) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
if (mutex == NULL) {
|
||||
return 0;
|
||||
if (mutex != NULL) {
|
||||
mutex->cpp_mutex.unlock();
|
||||
}
|
||||
|
||||
mutex->cpp_mutex.unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user