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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
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