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;