From 4375b7e8f9d3cf49b17a519328c96667f9ad3e92 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 12 Jul 2024 08:58:18 -0700 Subject: [PATCH] Make sure SDL subsystems are initialized before starting threads --- src/SDL.c | 46 ++++++++++++++++++++++++++++------------- src/SDL_internal.h | 2 ++ src/thread/SDL_thread.c | 7 +------ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/SDL.c b/src/SDL.c index b55facdb7fe51..2b2704cd2e845 100644 --- a/src/SDL.c +++ b/src/SDL.c @@ -114,6 +114,7 @@ static SDL_bool SDL_MainIsReady = SDL_FALSE; #else static SDL_bool SDL_MainIsReady = SDL_TRUE; #endif +static SDL_bool SDL_main_thread_initialized = SDL_FALSE; static SDL_bool SDL_bInMainQuit = SDL_FALSE; static Uint8 SDL_SubsystemRefCount[32]; @@ -179,6 +180,36 @@ void SDL_SetMainReady(void) SDL_MainIsReady = SDL_TRUE; } +void SDL_InitMainThread(void) +{ + if (SDL_main_thread_initialized) { + return; + } + + SDL_InitTLSData(); +#ifndef SDL_TIMERS_DISABLED + SDL_TicksInit(); +#endif + SDL_LogInit(); + + SDL_main_thread_initialized = SDL_TRUE; +} + +static void SDL_QuitMainThread(void) +{ + if (!SDL_main_thread_initialized) { + return; + } + + SDL_LogQuit(); +#ifndef SDL_TIMERS_DISABLED + SDL_TicksQuit(); +#endif + SDL_QuitTLSData(); + + SDL_main_thread_initialized = SDL_FALSE; +} + int SDL_InitSubSystem(Uint32 flags) { Uint32 flags_initialized = 0; @@ -187,9 +218,6 @@ int SDL_InitSubSystem(Uint32 flags) return SDL_SetError("Application didn't initialize properly, did you include SDL_main.h in the file containing your main() function?"); } - SDL_InitTLSData(); - SDL_LogInit(); - /* Clear the error message */ SDL_ClearError(); @@ -205,10 +233,6 @@ int SDL_InitSubSystem(Uint32 flags) } #endif -#ifndef SDL_TIMERS_DISABLED - SDL_TicksInit(); -#endif - /* Initialize the event subsystem */ if (flags & SDL_INIT_EVENTS) { #ifndef SDL_EVENTS_DISABLED @@ -496,10 +520,6 @@ void SDL_Quit(void) #endif SDL_QuitSubSystem(SDL_INIT_EVERYTHING); -#ifndef SDL_TIMERS_DISABLED - SDL_TicksQuit(); -#endif - #ifdef SDL_USE_LIBDBUS SDL_DBus_Quit(); #endif @@ -507,14 +527,12 @@ void SDL_Quit(void) SDL_ClearHints(); SDL_AssertionsQuit(); - SDL_LogQuit(); - /* Now that every subsystem has been quit, we reset the subsystem refcount * and the list of initialized subsystems. */ SDL_memset(SDL_SubsystemRefCount, 0x0, sizeof(SDL_SubsystemRefCount)); - SDL_QuitTLSData(); + SDL_QuitMainThread(); SDL_bInMainQuit = SDL_FALSE; } diff --git a/src/SDL_internal.h b/src/SDL_internal.h index b193edef62f27..511c652407320 100644 --- a/src/SDL_internal.h +++ b/src/SDL_internal.h @@ -208,6 +208,8 @@ #include "SDL_assert.h" #include "SDL_log.h" +extern void SDL_InitMainThread(void); + #endif /* SDL_internal_h_ */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/thread/SDL_thread.c b/src/thread/SDL_thread.c index 5b5dae8fa3d7a..fae6b2dcfe201 100644 --- a/src/thread/SDL_thread.c +++ b/src/thread/SDL_thread.c @@ -27,7 +27,6 @@ #include "SDL_systhread.h" #include "SDL_hints.h" #include "../SDL_error_c.h" -#include "../timer/SDL_timer_c.h" /* The storage is local to the thread, but the IDs are global for the process */ @@ -370,11 +369,7 @@ SDL_Thread *SDL_CreateThreadWithStackSize(int(SDLCALL *fn)(void *), SDL_Thread *thread; int ret; - SDL_InitTLSData(); - -#ifndef SDL_TIMERS_DISABLED - SDL_TicksInit(); -#endif + SDL_InitMainThread(); /* Allocate memory for the thread info structure */ thread = (SDL_Thread *)SDL_calloc(1, sizeof(*thread));