Make sure SDL subsystems are initialized before starting threads
diff --git a/src/SDL.c b/src/SDL.c
index b55facd..2b2704c 100644
--- a/src/SDL.c
+++ b/src/SDL.c
@@ -114,6 +114,7 @@
#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 @@
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 @@
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 @@
}
#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 @@
#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 @@
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 b193ede..511c652 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 5b5dae8..fae6b2d 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 *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));