aboutsummaryrefslogtreecommitdiff
path: root/ports/sdl2/SDL-2.0.9-bug-4391-fix.patch
blob: f8fc64bda6ac0151ef4aedf7a8895f35b392ee9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# HG changeset patch
# User Sam Lantinga <slouken@libsdl.org>
# 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) {