Commit dbdbae44c57dcc2caf5e2b1ed81cc31a98860d8e

Ryan C. Gordon 2021-04-02T14:35:11

linux: (de)initialize d-bus at init and quit. Previously we had different subsystems quitting it, in conflict, and risked multiple threads racing to init it at the same time. Fixes #3643.

diff --git a/src/SDL.c b/src/SDL.c
index c5cf067..73f1cd7 100644
--- a/src/SDL.c
+++ b/src/SDL.c
@@ -34,6 +34,9 @@
 #include "thread/os2/SDL_systls_c.h"
 #endif
 
+/* this checks for HAVE_DBUS_DBUS_H internally. */
+#include "core/linux/SDL_dbus.h"
+
 #if defined(__EMSCRIPTEN__)
 #include <emscripten.h>
 #endif
@@ -155,6 +158,10 @@ SDL_InitSubSystem(Uint32 flags)
     /* Clear the error message */
     SDL_ClearError();
 
+#if SDL_USE_LIBDBUS
+    SDL_DBus_Init();
+#endif
+
     if ((flags & SDL_INIT_GAMECONTROLLER)) {
         /* game controller implies joystick */
         flags |= SDL_INIT_JOYSTICK;
@@ -442,6 +449,10 @@ SDL_Quit(void)
     SDL_AssertionsQuit();
     SDL_LogResetPriorities();
 
+#if SDL_USE_LIBDBUS
+    SDL_DBus_Quit();
+#endif
+
     /* Now that every subsystem has been quit, we reset the subsystem refcount
      * and the list of initialized subsystems.
      */
diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
index e43fb4c..1220311 100644
--- a/src/video/wayland/SDL_waylandvideo.c
+++ b/src/video/wayland/SDL_waylandvideo.c
@@ -575,12 +575,6 @@ Wayland_VideoQuit(_THIS)
 
     Wayland_QuitKeyboard(_this);
 
-/* !!! FIXME: other subsystems use D-Bus, so we shouldn't quit it here;
-       have SDL.c do this at a higher level, or add refcounting. */
-#if SDL_USE_LIBDBUS
-    SDL_DBus_Quit();
-#endif
-
     SDL_free(data->classname);
 }
 
diff --git a/src/video/x11/SDL_x11video.c b/src/video/x11/SDL_x11video.c
index 03fcaa5..3d60123 100644
--- a/src/video/x11/SDL_x11video.c
+++ b/src/video/x11/SDL_x11video.c
@@ -457,12 +457,6 @@ X11_VideoQuit(_THIS)
     X11_QuitKeyboard(_this);
     X11_QuitMouse(_this);
     X11_QuitTouch(_this);
-
-/* !!! FIXME: other subsystems use D-Bus, so we shouldn't quit it here;
-       have SDL.c do this at a higher level, or add refcounting. */
-#if SDL_USE_LIBDBUS
-    SDL_DBus_Quit();
-#endif
 }
 
 SDL_bool