Skip to content

Commit

Permalink
Make sure SDL subsystems are initialized before starting threads
Browse files Browse the repository at this point in the history
  • Loading branch information
slouken committed Jul 12, 2024
1 parent b378bc5 commit 4375b7e
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 20 deletions.
46 changes: 32 additions & 14 deletions src/SDL.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];

Expand Down Expand Up @@ -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;
Expand All @@ -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();

Expand All @@ -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
Expand Down Expand Up @@ -496,25 +520,19 @@ 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

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;
}
Expand Down
2 changes: 2 additions & 0 deletions src/SDL_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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: */
7 changes: 1 addition & 6 deletions src/thread/SDL_thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

Expand Down Expand Up @@ -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));
Expand Down

0 comments on commit 4375b7e

Please sign in to comment.