diff --git a/src/core/linux/SDL_dbus.c b/src/core/linux/SDL_dbus.c index 9b22f789f..e83da80c7 100644 --- a/src/core/linux/SDL_dbus.c +++ b/src/core/linux/SDL_dbus.c @@ -20,6 +20,7 @@ */ #include "../../SDL_internal.h" #include "SDL_dbus.h" +#include "SDL_atomic.h" #if SDL_USE_LIBDBUS /* we never link directly to libdbus. */ @@ -113,8 +114,12 @@ LoadDBUSLibrary(void) return retval; } -void -SDL_DBus_Init(void) + +static SDL_SpinLock spinlock_dbus_init = 0; + +/* you must hold spinlock_dbus_init before calling this! */ +static void +SDL_DBus_Init_Spinlocked(void) { static SDL_bool is_dbus_available = SDL_TRUE; if (!is_dbus_available) { @@ -156,6 +161,14 @@ SDL_DBus_Init(void) } } +void +SDL_DBus_Init(void) +{ + SDL_AtomicLock(&spinlock_dbus_init); /* make sure two threads can't init at same time, since this can happen before SDL_Init. */ + SDL_DBus_Init_Spinlocked(); + SDL_AtomicUnlock(&spinlock_dbus_init); +} + void SDL_DBus_Quit(void) {