# HG changeset patch # User Sam Lantinga # Date 1542691020 28800 # Node ID 9091b20040cf04cdc348d290ca22373b36364c39 # Parent 144400e4630d885d2eb0761b7174433b4c0d90bb Fixed bug 4391 - hid_enumerate() sometimes causes game to freeze for a few seconds Daniel Gibson Even though my game (dhewm3) doesn't use SDL_INIT_JOYSTICK, SDL_PumpEvent() calls SDL_JoystickUpdate() which ends up calling hid_enumerate() every three seconds, and sometimes on my Win7 box hid_enumerate() takes about 5 seconds, which causes the whole game to freeze for that time. diff -r 144400e4630d -r 9091b20040cf include/SDL_bits.h --- a/include/SDL_bits.h Sun Nov 18 19:28:20 2018 +0300 +++ b/include/SDL_bits.h Mon Nov 19 21:17:00 2018 -0800 @@ -101,6 +101,15 @@ #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 -r 144400e4630d -r 9091b20040cf src/SDL.c --- a/src/SDL.c Sun Nov 18 19:28:20 2018 +0300 +++ b/src/SDL.c Mon Nov 19 21:17:00 2018 -0800 @@ -348,6 +348,12 @@ 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 -r 144400e4630d -r 9091b20040cf src/joystick/SDL_joystick.c --- a/src/joystick/SDL_joystick.c Sun Nov 18 19:28:20 2018 +0300 +++ b/src/joystick/SDL_joystick.c Mon Nov 19 21:17:00 2018 -0800 @@ -1016,6 +1016,10 @@ int i; SDL_Joystick *joystick; + if (!SDL_WasInit(SDL_INIT_JOYSTICK)) { + return; + } + SDL_LockJoysticks(); if (SDL_updating_joystick) { diff -r 144400e4630d -r 9091b20040cf src/sensor/SDL_sensor.c --- a/src/sensor/SDL_sensor.c Sun Nov 18 19:28:20 2018 +0300 +++ b/src/sensor/SDL_sensor.c Mon Nov 19 21:17:00 2018 -0800 @@ -505,6 +505,10 @@ int i; SDL_Sensor *sensor; + if (!SDL_WasInit(SDL_INIT_SENSOR)) { + return; + } + SDL_LockSensors(); if (SDL_updating_sensor) {