diff --git a/include/SDL_bits.h b/include/SDL_bits.h index eb8322f0d..b6b668378 100644 --- a/include/SDL_bits.h +++ b/include/SDL_bits.h @@ -101,6 +101,15 @@ SDL_MostSignificantBitIndex32(Uint32 x) #endif } +SDL_FORCE_INLINE SDL_bool +SDL_HasExactlyOneBitSet32(Uint32 x) +{ + if (x && !(x & (x - 1))) { + return SDL_TRUE; + } + return SDL_FALSE; +} + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/src/SDL.c b/src/SDL.c index 6d7e16662..7a1c74962 100644 --- a/src/SDL.c +++ b/src/SDL.c @@ -348,6 +348,12 @@ SDL_WasInit(Uint32 flags) int num_subsystems = SDL_arraysize(SDL_SubsystemRefCount); Uint32 initialized = 0; + /* Fast path for checking one flag */ + if (SDL_HasExactlyOneBitSet32(flags)) { + int subsystem_index = SDL_MostSignificantBitIndex32(flags); + return SDL_SubsystemRefCount[subsystem_index] ? flags : 0; + } + if (!flags) { flags = SDL_INIT_EVERYTHING; } diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c index 8c784aec7..12942a5f7 100644 --- a/src/joystick/SDL_joystick.c +++ b/src/joystick/SDL_joystick.c @@ -1016,6 +1016,10 @@ SDL_JoystickUpdate(void) int i; SDL_Joystick *joystick; + if (!SDL_WasInit(SDL_INIT_JOYSTICK)) { + return; + } + SDL_LockJoysticks(); if (SDL_updating_joystick) { diff --git a/src/sensor/SDL_sensor.c b/src/sensor/SDL_sensor.c index 5c7a99019..945421f6d 100644 --- a/src/sensor/SDL_sensor.c +++ b/src/sensor/SDL_sensor.c @@ -505,6 +505,10 @@ SDL_SensorUpdate(void) int i; SDL_Sensor *sensor; + if (!SDL_WasInit(SDL_INIT_SENSOR)) { + return; + } + SDL_LockSensors(); if (SDL_updating_sensor) {