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.
This commit is contained in:
Ryan C. Gordon 2021-04-02 14:35:11 -04:00
parent 57c2a4566f
commit dbdbae44c5
No known key found for this signature in database
GPG Key ID: FA148B892AB48044
3 changed files with 11 additions and 12 deletions

View File

@ -34,6 +34,9 @@
#include "thread/os2/SDL_systls_c.h" #include "thread/os2/SDL_systls_c.h"
#endif #endif
/* this checks for HAVE_DBUS_DBUS_H internally. */
#include "core/linux/SDL_dbus.h"
#if defined(__EMSCRIPTEN__) #if defined(__EMSCRIPTEN__)
#include <emscripten.h> #include <emscripten.h>
#endif #endif
@ -155,6 +158,10 @@ SDL_InitSubSystem(Uint32 flags)
/* Clear the error message */ /* Clear the error message */
SDL_ClearError(); SDL_ClearError();
#if SDL_USE_LIBDBUS
SDL_DBus_Init();
#endif
if ((flags & SDL_INIT_GAMECONTROLLER)) { if ((flags & SDL_INIT_GAMECONTROLLER)) {
/* game controller implies joystick */ /* game controller implies joystick */
flags |= SDL_INIT_JOYSTICK; flags |= SDL_INIT_JOYSTICK;
@ -442,6 +449,10 @@ SDL_Quit(void)
SDL_AssertionsQuit(); SDL_AssertionsQuit();
SDL_LogResetPriorities(); SDL_LogResetPriorities();
#if SDL_USE_LIBDBUS
SDL_DBus_Quit();
#endif
/* Now that every subsystem has been quit, we reset the subsystem refcount /* Now that every subsystem has been quit, we reset the subsystem refcount
* and the list of initialized subsystems. * and the list of initialized subsystems.
*/ */

View File

@ -575,12 +575,6 @@ Wayland_VideoQuit(_THIS)
Wayland_QuitKeyboard(_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); SDL_free(data->classname);
} }

View File

@ -457,12 +457,6 @@ X11_VideoQuit(_THIS)
X11_QuitKeyboard(_this); X11_QuitKeyboard(_this);
X11_QuitMouse(_this); X11_QuitMouse(_this);
X11_QuitTouch(_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 SDL_bool