Commit ca867fc92d822e2cf4e7d83921ce1c2c8721e44c

David Ludwig 2013-12-25T14:42:38

WinRT: prevented a potential race condition in the XInput backend The race condition could've been triggered on device removal.

diff --git a/src/joystick/winrt/SDL_xinputjoystick.c b/src/joystick/winrt/SDL_xinputjoystick.c
index 7c2853f..1bb91b2 100644
--- a/src/joystick/winrt/SDL_xinputjoystick.c
+++ b/src/joystick/winrt/SDL_xinputjoystick.c
@@ -106,25 +106,27 @@ DeviceDetectionThreadMain(void * _data)
          */
 
         /* See if any new devices are connected. */
+        SDL_LockMutex(g_DeviceInfoLock);
         for (i = 0; i < XUSER_MAX_COUNT; ++i) {
             if (!g_XInputData[i].isDeviceConnected &&
                 !g_XInputData[i].isDeviceConnectionEventPending &&
                 !g_XInputData[i].isDeviceRemovalEventPending)
             {
+                SDL_UnlockMutex(g_DeviceInfoLock);
                 result = XInputGetCapabilities(i, 0, &tempXInputCaps);
+                SDL_LockMutex(g_DeviceInfoLock);
                 if (result == ERROR_SUCCESS) {
                     /* Yes, a device is connected.  Mark it as such.
                        Others will be told about this (via an
                        SDL_JOYDEVICEADDED event) in the next call to
                        SDL_SYS_JoystickDetect.
                      */
-                    SDL_LockMutex(g_DeviceInfoLock);
                     g_XInputData[i].isDeviceConnected = SDL_TRUE;
                     g_XInputData[i].isDeviceConnectionEventPending = SDL_TRUE;
-                    SDL_UnlockMutex(g_DeviceInfoLock);
                 }
             }
         }
+        SDL_UnlockMutex(g_DeviceInfoLock);
     }
 
     return 0;