mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-10-16 06:45:59 +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:
@@ -32,24 +32,20 @@ struct SDL_Mutex
|
||||
SceKernelLwMutexWork lock;
|
||||
};
|
||||
|
||||
/* Create a mutex */
|
||||
SDL_Mutex *SDL_CreateMutex(void)
|
||||
{
|
||||
SDL_Mutex *mutex = NULL;
|
||||
SceInt32 res = 0;
|
||||
|
||||
/* Allocate mutex memory */
|
||||
mutex = (SDL_Mutex *)SDL_malloc(sizeof(*mutex));
|
||||
SDL_Mutex *mutex = (SDL_Mutex *)SDL_malloc(sizeof(*mutex));
|
||||
if (mutex != NULL) {
|
||||
|
||||
res = sceKernelCreateLwMutex(
|
||||
&mutex->lock,
|
||||
"SDL mutex",
|
||||
SCE_KERNEL_MUTEX_ATTR_RECURSIVE,
|
||||
0,
|
||||
NULL);
|
||||
const SceInt32 res = sceKernelCreateLwMutex(
|
||||
&mutex->lock,
|
||||
"SDL mutex",
|
||||
SCE_KERNEL_MUTEX_ATTR_RECURSIVE,
|
||||
0,
|
||||
NULL);
|
||||
|
||||
if (res < 0) {
|
||||
SDL_free(mutex);
|
||||
mutex = NULL;
|
||||
SDL_SetError("Error trying to create mutex: %x", res);
|
||||
}
|
||||
} else {
|
||||
@@ -58,7 +54,6 @@ SDL_Mutex *SDL_CreateMutex(void)
|
||||
return mutex;
|
||||
}
|
||||
|
||||
/* Free the mutex */
|
||||
void SDL_DestroyMutex(SDL_Mutex *mutex)
|
||||
{
|
||||
if (mutex != NULL) {
|
||||
@@ -67,28 +62,16 @@ void SDL_DestroyMutex(SDL_Mutex *mutex)
|
||||
}
|
||||
}
|
||||
|
||||
/* Lock the mutex */
|
||||
int SDL_LockMutex(SDL_Mutex *mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
||||
void SDL_LockMutex(SDL_Mutex *mutex) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
#ifdef SDL_THREADS_DISABLED
|
||||
return 0;
|
||||
#else
|
||||
SceInt32 res = 0;
|
||||
|
||||
if (mutex == NULL) {
|
||||
return 0;
|
||||
#ifndef SDL_THREADS_DISABLED
|
||||
if (mutex != NULL) {
|
||||
const SceInt32 res = sceKernelLockLwMutex(&mutex->lock, 1, NULL);
|
||||
SDL_assert(res == SCE_KERNEL_OK); // assume we're in a lot of trouble if this assert fails.
|
||||
}
|
||||
|
||||
res = sceKernelLockLwMutex(&mutex->lock, 1, NULL);
|
||||
if (res != SCE_KERNEL_OK) {
|
||||
return SDL_SetError("Error trying to lock mutex: %x", res);
|
||||
}
|
||||
|
||||
return 0;
|
||||
#endif /* SDL_THREADS_DISABLED */
|
||||
#endif // SDL_THREADS_DISABLED
|
||||
}
|
||||
|
||||
/* Try to lock the mutex */
|
||||
int SDL_TryLockMutex(SDL_Mutex *mutex)
|
||||
{
|
||||
#ifdef SDL_THREADS_DISABLED
|
||||
@@ -102,40 +85,24 @@ int SDL_TryLockMutex(SDL_Mutex *mutex)
|
||||
|
||||
res = sceKernelTryLockLwMutex(&mutex->lock, 1);
|
||||
switch (res) {
|
||||
case SCE_KERNEL_OK:
|
||||
return 0;
|
||||
break;
|
||||
case SCE_KERNEL_ERROR_MUTEX_FAILED_TO_OWN:
|
||||
return SDL_MUTEX_TIMEDOUT;
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Error trying to lock mutex: %x", res);
|
||||
break;
|
||||
case SCE_KERNEL_OK: return 0;
|
||||
case SCE_KERNEL_ERROR_MUTEX_FAILED_TO_OWN: return SDL_MUTEX_TIMEDOUT;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return -1;
|
||||
#endif /* SDL_THREADS_DISABLED */
|
||||
SDL_assert(!"Error trying to lock mutex"); // assume we're in a lot of trouble if this assert fails.
|
||||
return SDL_MUTEX_TIMEDOUT;
|
||||
#endif // SDL_THREADS_DISABLED
|
||||
}
|
||||
|
||||
/* Unlock the mutex */
|
||||
int SDL_UnlockMutex(SDL_Mutex *mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
||||
void SDL_UnlockMutex(SDL_Mutex *mutex) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
#ifdef SDL_THREADS_DISABLED
|
||||
return 0;
|
||||
#else
|
||||
SceInt32 res = 0;
|
||||
|
||||
if (mutex == NULL) {
|
||||
return 0;
|
||||
#ifndef SDL_THREADS_DISABLED
|
||||
if (mutex != NULL) {
|
||||
const SceInt32 res = sceKernelUnlockLwMutex(&mutex->lock, 1);
|
||||
SDL_assert(res == SCE_KERNEL_OK); // assume we're in a lot of trouble if this assert fails.
|
||||
}
|
||||
|
||||
res = sceKernelUnlockLwMutex(&mutex->lock, 1);
|
||||
if (res != 0) {
|
||||
return SDL_SetError("Error trying to unlock mutex: %x", res);
|
||||
}
|
||||
|
||||
return 0;
|
||||
#endif /* SDL_THREADS_DISABLED */
|
||||
#endif // SDL_THREADS_DISABLED
|
||||
}
|
||||
|
||||
#endif /* SDL_THREAD_VITA */
|
||||
#endif // SDL_THREAD_VITA
|
||||
|
Reference in New Issue
Block a user