mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-04-19 22:10:52 +00:00
Use SDL_bool instead an int return code in the SDL API
Most SDL functions used to indicate success or failure using an int return code. These functions have been changed to return SDL_bool. Here is a coccinelle patch to change code that previously compared the return value to 0 and changes it to a boolean test: @ bool_return_type @ identifier func =~ "^(SDL_AddEventWatch|SDL_AddHintCallback|SDL_AddSurfaceAlternateImage|SDL_AddVulkanRenderSemaphores|SDL_BindAudioStream|SDL_BindAudioStreams|SDL_BlitSurface|SDL_BlitSurface9Grid|SDL_BlitSurfaceScaled|SDL_BlitSurfaceTiled|SDL_BlitSurfaceTiledWithScale|SDL_BlitSurfaceUnchecked|SDL_BlitSurfaceUncheckedScaled|SDL_CaptureMouse|SDL_ClearAudioStream|SDL_ClearClipboardData|SDL_ClearComposition|SDL_ClearError|SDL_ClearProperty|SDL_ClearSurface|SDL_CloseIO|SDL_CloseStorage|SDL_ConvertAudioSamples|SDL_ConvertEventToRenderCoordinates|SDL_ConvertPixels|SDL_ConvertPixelsAndColorspace|SDL_CopyFile|SDL_CopyProperties|SDL_CopyStorageFile|SDL_CreateDirectory|SDL_CreateStorageDirectory|SDL_CreateWindowAndRenderer|SDL_DateTimeToTime|SDL_DestroyWindowSurface|SDL_DetachVirtualJoystick|SDL_DisableScreenSaver|SDL_EnableScreenSaver|SDL_EnumerateDirectory|SDL_EnumerateProperties|SDL_EnumerateStorageDirectory|SDL_FillSurfaceRect|SDL_FillSurfaceRects|SDL_FlashWindow|SDL_FlipSurface|SDL_FlushAudioStream|SDL_FlushRenderer|SDL_GL_DestroyContext|SDL_GL_GetAttribute|SDL_GL_GetSwapInterval|SDL_GL_LoadLibrary|SDL_GL_MakeCurrent|SDL_GL_SetAttribute|SDL_GL_SetSwapInterval|SDL_GL_SwapWindow|SDL_GetAudioDeviceFormat|SDL_GetAudioStreamFormat|SDL_GetCameraFormat|SDL_GetClosestFullscreenDisplayMode|SDL_GetCurrentRenderOutputSize|SDL_GetCurrentTime|SDL_GetDXGIOutputInfo|SDL_GetDateTimeLocalePreferences|SDL_GetDisplayBounds|SDL_GetDisplayUsableBounds|SDL_GetGDKDefaultUser|SDL_GetGDKTaskQueue|SDL_GetGamepadSensorData|SDL_GetGamepadTouchpadFinger|SDL_GetHapticEffectStatus|SDL_GetJoystickBall|SDL_GetMasksForPixelFormat|SDL_GetPathInfo|SDL_GetRectUnion|SDL_GetRectUnionFloat|SDL_GetRenderClipRect|SDL_GetRenderColorScale|SDL_GetRenderDrawBlendMode|SDL_GetRenderDrawColor|SDL_GetRenderDrawColorFloat|SDL_GetRenderLogicalPresentation|SDL_GetRenderLogicalPresentationRect|SDL_GetRenderOutputSize|SDL_GetRenderSafeArea|SDL_GetRenderScale|SDL_GetRenderVSync|SDL_GetRenderViewport|SDL_GetSensorData|SDL_GetStorageFileSize|SDL_GetStoragePathInfo|SDL_GetSurfaceAlphaMod|SDL_GetSurfaceBlendMode|SDL_GetSurfaceClipRect|SDL_GetSurfaceColorKey|SDL_GetSurfaceColorMod|SDL_GetTextInputArea|SDL_GetTextureAlphaMod|SDL_GetTextureAlphaModFloat|SDL_GetTextureBlendMode|SDL_GetTextureColorMod|SDL_GetTextureColorModFloat|SDL_GetTextureScaleMode|SDL_GetTextureSize|SDL_GetWindowAspectRatio|SDL_GetWindowBordersSize|SDL_GetWindowMaximumSize|SDL_GetWindowMinimumSize|SDL_GetWindowPosition|SDL_GetWindowRelativeMouseMode|SDL_GetWindowSafeArea|SDL_GetWindowSize|SDL_GetWindowSizeInPixels|SDL_GetWindowSurfaceVSync|SDL_HideCursor|SDL_HideWindow|SDL_Init|SDL_InitHapticRumble|SDL_InitSubSystem|SDL_LoadWAV|SDL_LoadWAV_IO|SDL_LockAudioStream|SDL_LockProperties|SDL_LockSurface|SDL_LockTexture|SDL_LockTextureToSurface|SDL_MaximizeWindow|SDL_MinimizeWindow|SDL_MixAudio|SDL_OpenURL|SDL_OutOfMemory|SDL_PauseAudioDevice|SDL_PauseAudioStreamDevice|SDL_PauseHaptic|SDL_PlayHapticRumble|SDL_PremultiplyAlpha|SDL_PremultiplySurfaceAlpha|SDL_PushEvent|SDL_PutAudioStreamData|SDL_RaiseWindow|SDL_ReadStorageFile|SDL_ReadSurfacePixel|SDL_ReadSurfacePixelFloat|SDL_RegisterApp|SDL_ReloadGamepadMappings|SDL_RemovePath|SDL_RemoveStoragePath|SDL_RemoveTimer|SDL_RenamePath|SDL_RenameStoragePath|SDL_RenderClear|SDL_RenderCoordinatesFromWindow|SDL_RenderCoordinatesToWindow|SDL_RenderFillRect|SDL_RenderFillRects|SDL_RenderGeometry|SDL_RenderGeometryRaw|SDL_RenderLine|SDL_RenderLines|SDL_RenderPoint|SDL_RenderPoints|SDL_RenderPresent|SDL_RenderRect|SDL_RenderRects|SDL_RenderTexture|SDL_RenderTexture9Grid|SDL_RenderTextureRotated|SDL_RenderTextureTiled|SDL_RequestAndroidPermission|SDL_RestoreWindow|SDL_ResumeAudioDevice|SDL_ResumeAudioStreamDevice|SDL_ResumeHaptic|SDL_RumbleGamepad|SDL_RumbleGamepadTriggers|SDL_RumbleJoystick|SDL_RumbleJoystickTriggers|SDL_RunHapticEffect|SDL_SaveBMP|SDL_SaveBMP_IO|SDL_SendAndroidMessage|SDL_SendGamepadEffect|SDL_SendJoystickEffect|SDL_SendJoystickVirtualSensorData|SDL_SetAppMetadata|SDL_SetAppMetadataProperty|SDL_SetAudioDeviceGain|SDL_SetAudioPostmixCallback|SDL_SetAudioStreamFormat|SDL_SetAudioStreamFrequencyRatio|SDL_SetAudioStreamGain|SDL_SetAudioStreamGetCallback|SDL_SetAudioStreamInputChannelMap|SDL_SetAudioStreamOutputChannelMap|SDL_SetAudioStreamPutCallback|SDL_SetBooleanProperty|SDL_SetClipboardData|SDL_SetClipboardText|SDL_SetCursor|SDL_SetFloatProperty|SDL_SetGamepadLED|SDL_SetGamepadMapping|SDL_SetGamepadPlayerIndex|SDL_SetGamepadSensorEnabled|SDL_SetHapticAutocenter|SDL_SetHapticGain|SDL_SetJoystickLED|SDL_SetJoystickPlayerIndex|SDL_SetJoystickVirtualAxis|SDL_SetJoystickVirtualBall|SDL_SetJoystickVirtualButton|SDL_SetJoystickVirtualHat|SDL_SetJoystickVirtualTouchpad|SDL_SetLinuxThreadPriority|SDL_SetLinuxThreadPriorityAndPolicy|SDL_SetLogPriorityPrefix|SDL_SetMemoryFunctions|SDL_SetNumberProperty|SDL_SetPaletteColors|SDL_SetPointerProperty|SDL_SetPointerPropertyWithCleanup|SDL_SetPrimarySelectionText|SDL_SetRenderClipRect|SDL_SetRenderColorScale|SDL_SetRenderDrawBlendMode|SDL_SetRenderDrawColor|SDL_SetRenderDrawColorFloat|SDL_SetRenderLogicalPresentation|SDL_SetRenderScale|SDL_SetRenderTarget|SDL_SetRenderVSync|SDL_SetRenderViewport|SDL_SetScancodeName|SDL_SetStringProperty|SDL_SetSurfaceAlphaMod|SDL_SetSurfaceBlendMode|SDL_SetSurfaceColorKey|SDL_SetSurfaceColorMod|SDL_SetSurfaceColorspace|SDL_SetSurfacePalette|SDL_SetSurfaceRLE|SDL_SetTLS|SDL_SetTextInputArea|SDL_SetTextureAlphaMod|SDL_SetTextureAlphaModFloat|SDL_SetTextureBlendMode|SDL_SetTextureColorMod|SDL_SetTextureColorModFloat|SDL_SetTextureScaleMode|SDL_SetThreadPriority|SDL_SetWindowAlwaysOnTop|SDL_SetWindowAspectRatio|SDL_SetWindowBordered|SDL_SetWindowFocusable|SDL_SetWindowFullscreen|SDL_SetWindowFullscreenMode|SDL_SetWindowHitTest|SDL_SetWindowIcon|SDL_SetWindowKeyboardGrab|SDL_SetWindowMaximumSize|SDL_SetWindowMinimumSize|SDL_SetWindowModalFor|SDL_SetWindowMouseGrab|SDL_SetWindowMouseRect|SDL_SetWindowOpacity|SDL_SetWindowPosition|SDL_SetWindowRelativeMouseMode|SDL_SetWindowResizable|SDL_SetWindowShape|SDL_SetWindowSize|SDL_SetWindowSurfaceVSync|SDL_SetWindowTitle|SDL_SetiOSAnimationCallback|SDL_ShowAndroidToast|SDL_ShowCursor|SDL_ShowMessageBox|SDL_ShowSimpleMessageBox|SDL_ShowWindow|SDL_ShowWindowSystemMenu|SDL_StartTextInput|SDL_StartTextInputWithProperties|SDL_StopHapticEffect|SDL_StopHapticEffects|SDL_StopHapticRumble|SDL_StopTextInput|SDL_SyncWindow|SDL_TimeToDateTime|SDL_TryLockMutex|SDL_TryLockRWLockForReading|SDL_TryLockRWLockForWriting|SDL_TryWaitSemaphore|SDL_UnlockAudioStream|SDL_UpdateHapticEffect|SDL_UpdateNVTexture|SDL_UpdateTexture|SDL_UpdateWindowSurface|SDL_UpdateWindowSurfaceRects|SDL_UpdateYUVTexture|SDL_Vulkan_CreateSurface|SDL_Vulkan_LoadLibrary|SDL_WaitConditionTimeout|SDL_WaitSemaphoreTimeout|SDL_WarpMouseGlobal|SDL_WriteStorageFile|SDL_WriteSurfacePixel|SDL_WriteSurfacePixelFloat)$"; @@ ( func( ... ) - == 0 | - func( + !func( ... ) - < 0 | - func( + !func( ... ) - != 0 | - func( + !func( ... ) - == -1 )
This commit is contained in:
@@ -25,9 +25,9 @@
|
||||
|
||||
typedef SDL_Condition *(*pfnSDL_CreateCondition)(void);
|
||||
typedef void (*pfnSDL_DestroyCondition)(SDL_Condition *);
|
||||
typedef int (*pfnSDL_SignalCondition)(SDL_Condition *);
|
||||
typedef int (*pfnSDL_BroadcastCondition)(SDL_Condition *);
|
||||
typedef int (*pfnSDL_WaitConditionTimeoutNS)(SDL_Condition *, SDL_Mutex *, Sint64);
|
||||
typedef void (*pfnSDL_SignalCondition)(SDL_Condition *);
|
||||
typedef void (*pfnSDL_BroadcastCondition)(SDL_Condition *);
|
||||
typedef bool (*pfnSDL_WaitConditionTimeoutNS)(SDL_Condition *, SDL_Mutex *, Sint64);
|
||||
|
||||
typedef struct SDL_cond_impl_t
|
||||
{
|
||||
@@ -90,42 +90,23 @@ static void SDL_DestroyCondition_cv(SDL_Condition *cond)
|
||||
SDL_free(cond);
|
||||
}
|
||||
|
||||
static int SDL_SignalCondition_cv(SDL_Condition *_cond)
|
||||
static void SDL_SignalCondition_cv(SDL_Condition *_cond)
|
||||
{
|
||||
SDL_cond_cv *cond = (SDL_cond_cv *)_cond;
|
||||
if (!cond) {
|
||||
return SDL_InvalidParamError("cond");
|
||||
}
|
||||
|
||||
pWakeConditionVariable(&cond->cond);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int SDL_BroadcastCondition_cv(SDL_Condition *_cond)
|
||||
static void SDL_BroadcastCondition_cv(SDL_Condition *_cond)
|
||||
{
|
||||
SDL_cond_cv *cond = (SDL_cond_cv *)_cond;
|
||||
if (!cond) {
|
||||
return SDL_InvalidParamError("cond");
|
||||
}
|
||||
|
||||
pWakeAllConditionVariable(&cond->cond);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int SDL_WaitConditionTimeoutNS_cv(SDL_Condition *_cond, SDL_Mutex *_mutex, Sint64 timeoutNS)
|
||||
static bool SDL_WaitConditionTimeoutNS_cv(SDL_Condition *_cond, SDL_Mutex *_mutex, Sint64 timeoutNS)
|
||||
{
|
||||
SDL_cond_cv *cond = (SDL_cond_cv *)_cond;
|
||||
DWORD timeout;
|
||||
int ret;
|
||||
|
||||
if (!cond) {
|
||||
return SDL_InvalidParamError("cond");
|
||||
}
|
||||
if (!_mutex) {
|
||||
return SDL_InvalidParamError("mutex");
|
||||
}
|
||||
bool result;
|
||||
|
||||
if (timeoutNS < 0) {
|
||||
timeout = INFINITE;
|
||||
@@ -137,22 +118,15 @@ static int SDL_WaitConditionTimeoutNS_cv(SDL_Condition *_cond, SDL_Mutex *_mutex
|
||||
SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex;
|
||||
|
||||
if (mutex->count != 1 || mutex->owner != GetCurrentThreadId()) {
|
||||
return SDL_SetError("Passed mutex is not locked or locked recursively");
|
||||
// Passed mutex is not locked or locked recursively"
|
||||
return false;
|
||||
}
|
||||
|
||||
// The mutex must be updated to the released state
|
||||
mutex->count = 0;
|
||||
mutex->owner = 0;
|
||||
|
||||
if (pSleepConditionVariableSRW(&cond->cond, &mutex->srw, timeout, 0) == FALSE) {
|
||||
if (GetLastError() == ERROR_TIMEOUT) {
|
||||
ret = SDL_MUTEX_TIMEDOUT;
|
||||
} else {
|
||||
ret = SDL_SetError("SleepConditionVariableSRW() failed");
|
||||
}
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
result = pSleepConditionVariableSRW(&cond->cond, &mutex->srw, timeout, 0);
|
||||
|
||||
// The mutex is owned by us again, regardless of status of the wait
|
||||
SDL_assert(mutex->count == 0 && mutex->owner == 0);
|
||||
@@ -163,18 +137,10 @@ static int SDL_WaitConditionTimeoutNS_cv(SDL_Condition *_cond, SDL_Mutex *_mutex
|
||||
|
||||
SDL_assert(SDL_mutex_impl_active.Type == SDL_MUTEX_CS);
|
||||
|
||||
if (pSleepConditionVariableCS(&cond->cond, &mutex->cs, timeout) == FALSE) {
|
||||
if (GetLastError() == ERROR_TIMEOUT) {
|
||||
ret = SDL_MUTEX_TIMEDOUT;
|
||||
} else {
|
||||
ret = SDL_SetError("SleepConditionVariableCS() failed");
|
||||
}
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
result = pSleepConditionVariableCS(&cond->cond, &mutex->cs, timeout);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return result;
|
||||
}
|
||||
|
||||
static const SDL_cond_impl_t SDL_cond_impl_cv = {
|
||||
@@ -241,20 +207,34 @@ SDL_Condition *SDL_CreateCondition(void)
|
||||
|
||||
void SDL_DestroyCondition(SDL_Condition *cond)
|
||||
{
|
||||
SDL_cond_impl_active.Destroy(cond);
|
||||
if (cond) {
|
||||
SDL_cond_impl_active.Destroy(cond);
|
||||
}
|
||||
}
|
||||
|
||||
int SDL_SignalCondition(SDL_Condition *cond)
|
||||
void SDL_SignalCondition(SDL_Condition *cond)
|
||||
{
|
||||
return SDL_cond_impl_active.Signal(cond);
|
||||
if (!cond) {
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_cond_impl_active.Signal(cond);
|
||||
}
|
||||
|
||||
int SDL_BroadcastCondition(SDL_Condition *cond)
|
||||
void SDL_BroadcastCondition(SDL_Condition *cond)
|
||||
{
|
||||
return SDL_cond_impl_active.Broadcast(cond);
|
||||
if (!cond) {
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_cond_impl_active.Broadcast(cond);
|
||||
}
|
||||
|
||||
int SDL_WaitConditionTimeoutNS(SDL_Condition *cond, SDL_Mutex *mutex, Sint64 timeoutNS)
|
||||
SDL_bool SDL_WaitConditionTimeoutNS(SDL_Condition *cond, SDL_Mutex *mutex, Sint64 timeoutNS)
|
||||
{
|
||||
if (!cond || !mutex) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return SDL_cond_impl_active.WaitTimeoutNS(cond, mutex, timeoutNS);
|
||||
}
|
||||
|
||||
@@ -90,11 +90,11 @@ static void SDL_LockMutex_srw(SDL_Mutex *_mutex) SDL_NO_THREAD_SAFETY_ANALYSIS
|
||||
}
|
||||
}
|
||||
|
||||
static int SDL_TryLockMutex_srw(SDL_Mutex *_mutex)
|
||||
static bool SDL_TryLockMutex_srw(SDL_Mutex *_mutex)
|
||||
{
|
||||
SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex;
|
||||
const DWORD this_thread = GetCurrentThreadId();
|
||||
int retval = 0;
|
||||
bool retval = true;
|
||||
|
||||
if (mutex->owner == this_thread) {
|
||||
++mutex->count;
|
||||
@@ -104,7 +104,7 @@ static int SDL_TryLockMutex_srw(SDL_Mutex *_mutex)
|
||||
mutex->owner = this_thread;
|
||||
mutex->count = 1;
|
||||
} else {
|
||||
retval = SDL_MUTEX_TIMEDOUT;
|
||||
retval = false;
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
@@ -166,10 +166,10 @@ static void SDL_LockMutex_cs(SDL_Mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS /
|
||||
EnterCriticalSection(&mutex->cs);
|
||||
}
|
||||
|
||||
static int SDL_TryLockMutex_cs(SDL_Mutex *mutex_)
|
||||
static bool SDL_TryLockMutex_cs(SDL_Mutex *mutex_)
|
||||
{
|
||||
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
|
||||
return (TryEnterCriticalSection(&mutex->cs) == 0) ? SDL_MUTEX_TIMEDOUT : 0;
|
||||
return TryEnterCriticalSection(&mutex->cs);
|
||||
}
|
||||
|
||||
static void SDL_UnlockMutex_cs(SDL_Mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
@@ -234,9 +234,14 @@ void SDL_LockMutex(SDL_Mutex *mutex)
|
||||
}
|
||||
}
|
||||
|
||||
int SDL_TryLockMutex(SDL_Mutex *mutex)
|
||||
SDL_bool SDL_TryLockMutex(SDL_Mutex *mutex)
|
||||
{
|
||||
return mutex ? SDL_mutex_impl_active.TryLock(mutex) : 0;
|
||||
bool result = true;
|
||||
|
||||
if (mutex) {
|
||||
result = SDL_mutex_impl_active.TryLock(mutex);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void SDL_UnlockMutex(SDL_Mutex *mutex)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
typedef SDL_Mutex *(*pfnSDL_CreateMutex)(void);
|
||||
typedef void (*pfnSDL_LockMutex)(SDL_Mutex *);
|
||||
typedef int (*pfnSDL_TryLockMutex)(SDL_Mutex *);
|
||||
typedef bool (*pfnSDL_TryLockMutex)(SDL_Mutex *);
|
||||
typedef void (*pfnSDL_UnlockMutex)(SDL_Mutex *);
|
||||
typedef void (*pfnSDL_DestroyMutex)(SDL_Mutex *);
|
||||
|
||||
|
||||
@@ -59,8 +59,8 @@ typedef SDL_RWLock *(*pfnSDL_CreateRWLock)(void);
|
||||
typedef void (*pfnSDL_DestroyRWLock)(SDL_RWLock *);
|
||||
typedef void (*pfnSDL_LockRWLockForReading)(SDL_RWLock *);
|
||||
typedef void (*pfnSDL_LockRWLockForWriting)(SDL_RWLock *);
|
||||
typedef int (*pfnSDL_TryLockRWLockForReading)(SDL_RWLock *);
|
||||
typedef int (*pfnSDL_TryLockRWLockForWriting)(SDL_RWLock *);
|
||||
typedef bool (*pfnSDL_TryLockRWLockForReading)(SDL_RWLock *);
|
||||
typedef bool (*pfnSDL_TryLockRWLockForWriting)(SDL_RWLock *);
|
||||
typedef void (*pfnSDL_UnlockRWLock)(SDL_RWLock *);
|
||||
|
||||
typedef struct SDL_rwlock_impl_t
|
||||
@@ -97,59 +97,48 @@ static SDL_RWLock *SDL_CreateRWLock_srw(void)
|
||||
static void SDL_DestroyRWLock_srw(SDL_RWLock *_rwlock)
|
||||
{
|
||||
SDL_rwlock_srw *rwlock = (SDL_rwlock_srw *) _rwlock;
|
||||
if (rwlock) {
|
||||
// There are no kernel allocated resources
|
||||
SDL_free(rwlock);
|
||||
}
|
||||
// There are no kernel allocated resources
|
||||
SDL_free(rwlock);
|
||||
}
|
||||
|
||||
static void SDL_LockRWLockForReading_srw(SDL_RWLock *_rwlock) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
SDL_rwlock_srw *rwlock = (SDL_rwlock_srw *) _rwlock;
|
||||
if (rwlock != NULL) {
|
||||
pAcquireSRWLockShared(&rwlock->srw);
|
||||
}
|
||||
pAcquireSRWLockShared(&rwlock->srw);
|
||||
}
|
||||
|
||||
static void SDL_LockRWLockForWriting_srw(SDL_RWLock *_rwlock) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
SDL_rwlock_srw *rwlock = (SDL_rwlock_srw *) _rwlock;
|
||||
if (rwlock != NULL) {
|
||||
pAcquireSRWLockExclusive(&rwlock->srw);
|
||||
pAcquireSRWLockExclusive(&rwlock->srw);
|
||||
rwlock->write_owner = SDL_GetCurrentThreadID();
|
||||
}
|
||||
|
||||
static bool SDL_TryLockRWLockForReading_srw(SDL_RWLock *_rwlock)
|
||||
{
|
||||
SDL_rwlock_srw *rwlock = (SDL_rwlock_srw *) _rwlock;
|
||||
return pTryAcquireSRWLockShared(&rwlock->srw);
|
||||
}
|
||||
|
||||
static bool SDL_TryLockRWLockForWriting_srw(SDL_RWLock *_rwlock)
|
||||
{
|
||||
SDL_rwlock_srw *rwlock = (SDL_rwlock_srw *) _rwlock;
|
||||
if (pTryAcquireSRWLockExclusive(&rwlock->srw)) {
|
||||
rwlock->write_owner = SDL_GetCurrentThreadID();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static int SDL_TryLockRWLockForReading_srw(SDL_RWLock *_rwlock)
|
||||
{
|
||||
SDL_rwlock_srw *rwlock = (SDL_rwlock_srw *) _rwlock;
|
||||
int retval = 0;
|
||||
if (rwlock) {
|
||||
retval = pTryAcquireSRWLockShared(&rwlock->srw) ? 0 : SDL_RWLOCK_TIMEDOUT;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int SDL_TryLockRWLockForWriting_srw(SDL_RWLock *_rwlock)
|
||||
{
|
||||
SDL_rwlock_srw *rwlock = (SDL_rwlock_srw *) _rwlock;
|
||||
int retval = 0;
|
||||
if (rwlock) {
|
||||
retval = pTryAcquireSRWLockExclusive(&rwlock->srw) ? 0 : SDL_RWLOCK_TIMEDOUT;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void SDL_UnlockRWLock_srw(SDL_RWLock *_rwlock) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
SDL_rwlock_srw *rwlock = (SDL_rwlock_srw *) _rwlock;
|
||||
if (rwlock != NULL) {
|
||||
if (rwlock->write_owner == SDL_GetCurrentThreadID()) {
|
||||
rwlock->write_owner = 0;
|
||||
pReleaseSRWLockExclusive(&rwlock->srw);
|
||||
} else {
|
||||
pReleaseSRWLockShared(&rwlock->srw);
|
||||
}
|
||||
if (rwlock->write_owner == SDL_GetCurrentThreadID()) {
|
||||
rwlock->write_owner = 0;
|
||||
pReleaseSRWLockExclusive(&rwlock->srw);
|
||||
} else {
|
||||
pReleaseSRWLockShared(&rwlock->srw);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,31 +213,39 @@ void SDL_DestroyRWLock(SDL_RWLock *rwlock)
|
||||
|
||||
void SDL_LockRWLockForReading(SDL_RWLock *rwlock) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
if (rwlock != NULL) {
|
||||
if (rwlock) {
|
||||
SDL_rwlock_impl_active.LockForReading(rwlock);
|
||||
}
|
||||
}
|
||||
|
||||
void SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
if (rwlock != NULL) {
|
||||
if (rwlock) {
|
||||
SDL_rwlock_impl_active.LockForWriting(rwlock);
|
||||
}
|
||||
}
|
||||
|
||||
int SDL_TryLockRWLockForReading(SDL_RWLock *rwlock)
|
||||
SDL_bool SDL_TryLockRWLockForReading(SDL_RWLock *rwlock)
|
||||
{
|
||||
return rwlock ? SDL_rwlock_impl_active.TryLockForReading(rwlock) : 0;
|
||||
bool result = true;
|
||||
if (rwlock) {
|
||||
result = SDL_rwlock_impl_active.TryLockForReading(rwlock);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock)
|
||||
SDL_bool SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock)
|
||||
{
|
||||
return rwlock ? SDL_rwlock_impl_active.TryLockForWriting(rwlock) : 0;
|
||||
bool result = true;
|
||||
if (rwlock) {
|
||||
result = SDL_rwlock_impl_active.TryLockForWriting(rwlock);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void SDL_UnlockRWLock(SDL_RWLock *rwlock) SDL_NO_THREAD_SAFETY_ANALYSIS // clang doesn't know about NULL mutexes
|
||||
{
|
||||
if (rwlock != NULL) {
|
||||
if (rwlock) {
|
||||
SDL_rwlock_impl_active.Unlock(rwlock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
|
||||
typedef SDL_Semaphore *(*pfnSDL_CreateSemaphore)(Uint32);
|
||||
typedef void (*pfnSDL_DestroySemaphore)(SDL_Semaphore *);
|
||||
typedef int (*pfnSDL_WaitSemaphoreTimeoutNS)(SDL_Semaphore *, Sint64);
|
||||
typedef bool (*pfnSDL_WaitSemaphoreTimeoutNS)(SDL_Semaphore *, Sint64);
|
||||
typedef Uint32 (*pfnSDL_GetSemaphoreValue)(SDL_Semaphore *);
|
||||
typedef int (*pfnSDL_SignalSemaphore)(SDL_Semaphore *);
|
||||
typedef void (*pfnSDL_SignalSemaphore)(SDL_Semaphore *);
|
||||
|
||||
typedef struct SDL_semaphore_impl_t
|
||||
{
|
||||
@@ -47,7 +47,7 @@ typedef struct SDL_semaphore_impl_t
|
||||
pfnSDL_DestroySemaphore Destroy;
|
||||
pfnSDL_WaitSemaphoreTimeoutNS WaitTimeoutNS;
|
||||
pfnSDL_GetSemaphoreValue Value;
|
||||
pfnSDL_SignalSemaphore Post;
|
||||
pfnSDL_SignalSemaphore Signal;
|
||||
} SDL_sem_impl_t;
|
||||
|
||||
// Implementation will be chosen at runtime based on available Kernel features
|
||||
@@ -94,7 +94,7 @@ static void SDL_DestroySemaphore_atom(SDL_Semaphore *sem)
|
||||
SDL_free(sem);
|
||||
}
|
||||
|
||||
static int SDL_WaitSemaphoreTimeoutNS_atom(SDL_Semaphore *_sem, Sint64 timeoutNS)
|
||||
static bool SDL_WaitSemaphoreTimeoutNS_atom(SDL_Semaphore *_sem, Sint64 timeoutNS)
|
||||
{
|
||||
SDL_sem_atom *sem = (SDL_sem_atom *)_sem;
|
||||
LONG count;
|
||||
@@ -103,33 +103,34 @@ static int SDL_WaitSemaphoreTimeoutNS_atom(SDL_Semaphore *_sem, Sint64 timeoutNS
|
||||
DWORD timeout_eff;
|
||||
|
||||
if (!sem) {
|
||||
return SDL_InvalidParamError("sem");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (timeoutNS == 0) {
|
||||
count = sem->count;
|
||||
if (count == 0) {
|
||||
return SDL_MUTEX_TIMEDOUT;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (InterlockedCompareExchange(&sem->count, count - 1, count) == count) {
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
return SDL_MUTEX_TIMEDOUT;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (timeoutNS < 0) {
|
||||
for (;;) {
|
||||
count = sem->count;
|
||||
while (count == 0) {
|
||||
if (pWaitOnAddress(&sem->count, &count, sizeof(sem->count), INFINITE) == FALSE) {
|
||||
return SDL_SetError("WaitOnAddress() failed");
|
||||
if (!pWaitOnAddress(&sem->count, &count, sizeof(sem->count), INFINITE)) {
|
||||
return false;
|
||||
}
|
||||
count = sem->count;
|
||||
}
|
||||
|
||||
if (InterlockedCompareExchange(&sem->count, count - 1, count) == count) {
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -149,13 +150,10 @@ static int SDL_WaitSemaphoreTimeoutNS_atom(SDL_Semaphore *_sem, Sint64 timeoutNS
|
||||
if (deadline > now) {
|
||||
timeout_eff = (DWORD)SDL_NS_TO_MS(deadline - now);
|
||||
} else {
|
||||
return SDL_MUTEX_TIMEDOUT;
|
||||
return false;
|
||||
}
|
||||
if (pWaitOnAddress(&sem->count, &count, sizeof(count), timeout_eff) == FALSE) {
|
||||
if (GetLastError() == ERROR_TIMEOUT) {
|
||||
return SDL_MUTEX_TIMEDOUT;
|
||||
}
|
||||
return SDL_SetError("WaitOnAddress() failed");
|
||||
if (!pWaitOnAddress(&sem->count, &count, sizeof(count), timeout_eff)) {
|
||||
return false;
|
||||
}
|
||||
count = sem->count;
|
||||
}
|
||||
@@ -163,7 +161,7 @@ static int SDL_WaitSemaphoreTimeoutNS_atom(SDL_Semaphore *_sem, Sint64 timeoutNS
|
||||
// Actually the semaphore is only consumed if this succeeds
|
||||
// If it doesn't we need to do everything again
|
||||
if (InterlockedCompareExchange(&sem->count, count - 1, count) == count) {
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -173,25 +171,22 @@ static Uint32 SDL_GetSemaphoreValue_atom(SDL_Semaphore *_sem)
|
||||
SDL_sem_atom *sem = (SDL_sem_atom *)_sem;
|
||||
|
||||
if (!sem) {
|
||||
SDL_InvalidParamError("sem");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (Uint32)sem->count;
|
||||
}
|
||||
|
||||
static int SDL_SignalSemaphore_atom(SDL_Semaphore *_sem)
|
||||
static void SDL_SignalSemaphore_atom(SDL_Semaphore *_sem)
|
||||
{
|
||||
SDL_sem_atom *sem = (SDL_sem_atom *)_sem;
|
||||
|
||||
if (!sem) {
|
||||
return SDL_InvalidParamError("sem");
|
||||
return;
|
||||
}
|
||||
|
||||
InterlockedIncrement(&sem->count);
|
||||
pWakeByAddressSingle(&sem->count);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const SDL_sem_impl_t SDL_sem_impl_atom = {
|
||||
@@ -251,14 +246,13 @@ static void SDL_DestroySemaphore_kern(SDL_Semaphore *_sem)
|
||||
}
|
||||
}
|
||||
|
||||
static int SDL_WaitSemaphoreTimeoutNS_kern(SDL_Semaphore *_sem, Sint64 timeoutNS)
|
||||
static bool SDL_WaitSemaphoreTimeoutNS_kern(SDL_Semaphore *_sem, Sint64 timeoutNS)
|
||||
{
|
||||
SDL_sem_kern *sem = (SDL_sem_kern *)_sem;
|
||||
int retval;
|
||||
DWORD dwMilliseconds;
|
||||
|
||||
if (!sem) {
|
||||
return SDL_InvalidParamError("sem");
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
if (timeoutNS < 0) {
|
||||
@@ -269,16 +263,10 @@ static int SDL_WaitSemaphoreTimeoutNS_kern(SDL_Semaphore *_sem, Sint64 timeoutNS
|
||||
switch (WaitForSingleObjectEx(sem->id, dwMilliseconds, FALSE)) {
|
||||
case WAIT_OBJECT_0:
|
||||
InterlockedDecrement(&sem->count);
|
||||
retval = 0;
|
||||
break;
|
||||
case WAIT_TIMEOUT:
|
||||
retval = SDL_MUTEX_TIMEDOUT;
|
||||
break;
|
||||
return true;
|
||||
default:
|
||||
retval = SDL_SetError("WaitForSingleObject() failed");
|
||||
break;
|
||||
return false;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
// Returns the current count of the semaphore
|
||||
@@ -286,18 +274,19 @@ static Uint32 SDL_GetSemaphoreValue_kern(SDL_Semaphore *_sem)
|
||||
{
|
||||
SDL_sem_kern *sem = (SDL_sem_kern *)_sem;
|
||||
if (!sem) {
|
||||
SDL_InvalidParamError("sem");
|
||||
return 0;
|
||||
}
|
||||
return (Uint32)sem->count;
|
||||
}
|
||||
|
||||
static int SDL_SignalSemaphore_kern(SDL_Semaphore *_sem)
|
||||
static void SDL_SignalSemaphore_kern(SDL_Semaphore *_sem)
|
||||
{
|
||||
SDL_sem_kern *sem = (SDL_sem_kern *)_sem;
|
||||
|
||||
if (!sem) {
|
||||
return SDL_InvalidParamError("sem");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Increase the counter in the first place, because
|
||||
* after a successful release the semaphore may
|
||||
* immediately get destroyed by another thread which
|
||||
@@ -306,9 +295,7 @@ static int SDL_SignalSemaphore_kern(SDL_Semaphore *_sem)
|
||||
InterlockedIncrement(&sem->count);
|
||||
if (ReleaseSemaphore(sem->id, 1, NULL) == FALSE) {
|
||||
InterlockedDecrement(&sem->count); // restore
|
||||
return SDL_SetError("ReleaseSemaphore() failed");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const SDL_sem_impl_t SDL_sem_impl_kern = {
|
||||
@@ -366,7 +353,7 @@ void SDL_DestroySemaphore(SDL_Semaphore *sem)
|
||||
SDL_sem_impl_active.Destroy(sem);
|
||||
}
|
||||
|
||||
int SDL_WaitSemaphoreTimeoutNS(SDL_Semaphore *sem, Sint64 timeoutNS)
|
||||
SDL_bool SDL_WaitSemaphoreTimeoutNS(SDL_Semaphore *sem, Sint64 timeoutNS)
|
||||
{
|
||||
return SDL_sem_impl_active.WaitTimeoutNS(sem, timeoutNS);
|
||||
}
|
||||
@@ -376,9 +363,9 @@ Uint32 SDL_GetSemaphoreValue(SDL_Semaphore *sem)
|
||||
return SDL_sem_impl_active.Value(sem);
|
||||
}
|
||||
|
||||
int SDL_SignalSemaphore(SDL_Semaphore *sem)
|
||||
void SDL_SignalSemaphore(SDL_Semaphore *sem)
|
||||
{
|
||||
return SDL_sem_impl_active.Post(sem);
|
||||
SDL_sem_impl_active.Signal(sem);
|
||||
}
|
||||
|
||||
#endif // SDL_THREAD_WINDOWS
|
||||
|
||||
@@ -58,9 +58,9 @@ static unsigned __stdcall MINGW32_FORCEALIGN RunThreadViaBeginThreadEx(void *dat
|
||||
return (unsigned)RunThread(data);
|
||||
}
|
||||
|
||||
int SDL_SYS_CreateThread(SDL_Thread *thread,
|
||||
SDL_FunctionPointer vpfnBeginThread,
|
||||
SDL_FunctionPointer vpfnEndThread)
|
||||
bool SDL_SYS_CreateThread(SDL_Thread *thread,
|
||||
SDL_FunctionPointer vpfnBeginThread,
|
||||
SDL_FunctionPointer vpfnEndThread)
|
||||
{
|
||||
SDL_BeginThreadExCallback pfnBeginThread = (SDL_BeginThreadExCallback) vpfnBeginThread;
|
||||
|
||||
@@ -84,7 +84,7 @@ int SDL_SYS_CreateThread(SDL_Thread *thread,
|
||||
if (!thread->handle) {
|
||||
return SDL_SetError("Not enough resources to create thread");
|
||||
}
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
#pragma pack(push, 8)
|
||||
@@ -161,7 +161,7 @@ SDL_ThreadID SDL_GetCurrentThreadID(void)
|
||||
return (SDL_ThreadID)GetCurrentThreadId();
|
||||
}
|
||||
|
||||
int SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
|
||||
bool SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
|
||||
{
|
||||
int value;
|
||||
|
||||
@@ -177,7 +177,7 @@ int SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
|
||||
if (!SetThreadPriority(GetCurrentThread(), value)) {
|
||||
return WIN_SetError("SetThreadPriority()");
|
||||
}
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
void SDL_SYS_WaitThread(SDL_Thread *thread)
|
||||
|
||||
@@ -65,7 +65,7 @@ SDL_TLSData *SDL_SYS_GetTLSData(void)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int SDL_SYS_SetTLSData(SDL_TLSData *data)
|
||||
bool SDL_SYS_SetTLSData(SDL_TLSData *data)
|
||||
{
|
||||
if (generic_local_storage) {
|
||||
return SDL_Generic_SetTLSData(data);
|
||||
@@ -74,7 +74,7 @@ int SDL_SYS_SetTLSData(SDL_TLSData *data)
|
||||
if (!TlsSetValue(thread_local_storage, data)) {
|
||||
return WIN_SetError("TlsSetValue()");
|
||||
}
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
void SDL_SYS_QuitTLSData(void)
|
||||
|
||||
Reference in New Issue
Block a user