diff --git a/include/SDL3/SDL_hints.h b/include/SDL3/SDL_hints.h index e12093360e..b7faa5a686 100644 --- a/include/SDL3/SDL_hints.h +++ b/include/SDL3/SDL_hints.h @@ -2706,7 +2706,6 @@ extern "C" { */ #define SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES "SDL_AUDIO_DEVICE_SAMPLE_FRAMES" - /** * Request SDL_AppIterate() be called at a specific rate. * @@ -2721,6 +2720,22 @@ extern "C" { */ #define SDL_HINT_MAIN_CALLBACK_RATE "SDL_MAIN_CALLBACK_RATE" +/** + * Let SDL handle dbus_shutdown(). + * + * Only enable this option if no other dependency uses D-Bus. + * + * This option tells SDL that it can safely call dbus_shutdown() when + * SDL_Quit() is called. You must ensure that no other library still uses + * D-Bus when SDL_Quit() is called, otherwise resources will be freed while + * they are still in use, which results in undefined behavior and likely a + * crash. + * + * Use this option to prevent memory leaks if your application doesn't use + * D-Bus other than through SDL. + */ +#define SDL_HINT_SHUTDOWN_DBUS_ON_QUIT "SDL_SHUTDOWN_DBUS_ON_QUIT" + /** * An enumeration of hint priorities diff --git a/src/SDL.c b/src/SDL.c index d39303ffe1..b6b20fb97d 100644 --- a/src/SDL.c +++ b/src/SDL.c @@ -517,13 +517,13 @@ void SDL_Quit(void) SDL_QuitTicks(); #endif - SDL_ClearHints(); - SDL_AssertionsQuit(); - #ifdef SDL_USE_LIBDBUS SDL_DBus_Quit(); #endif + SDL_ClearHints(); + SDL_AssertionsQuit(); + SDL_QuitProperties(); SDL_QuitLog(); diff --git a/src/core/linux/SDL_dbus.c b/src/core/linux/SDL_dbus.c index 8bfbec8ad0..22b7bdea2c 100644 --- a/src/core/linux/SDL_dbus.c +++ b/src/core/linux/SDL_dbus.c @@ -183,14 +183,12 @@ void SDL_DBus_Quit(void) dbus.connection_close(dbus.session_conn); dbus.connection_unref(dbus.session_conn); } -/* Don't do this - bug 3950 - dbus_shutdown() is a debug feature which closes all global resources in the dbus library. Calling this should be done by the app, not a library, because if there are multiple users of dbus in the process then SDL could shut it down even though another part is using it. -*/ -#if 0 - if (dbus.shutdown) { + + SDL_bool q = SDL_GetHintBoolean(SDL_HINT_SHUTDOWN_DBUS_ON_QUIT, SDL_FALSE); + if (q == SDL_TRUE && dbus.shutdown) { dbus.shutdown(); } -#endif + SDL_zero(dbus); UnloadDBUSLibrary(); SDL_free(inhibit_handle);