From dbdbae44c57dcc2caf5e2b1ed81cc31a98860d8e Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 2 Apr 2021 14:35:11 -0400 Subject: [PATCH] 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. --- src/SDL.c | 11 +++++++++++ src/video/wayland/SDL_waylandvideo.c | 6 ------ src/video/x11/SDL_x11video.c | 6 ------ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/SDL.c b/src/SDL.c index c5cf06730..73f1cd7f0 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 #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 e43fb4cce..12203111e 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 03fcaa5a1..3d601231b 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