From ca867fc92d822e2cf4e7d83921ce1c2c8721e44c Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Wed, 25 Dec 2013 14:42:38 -0500 Subject: [PATCH] WinRT: prevented a potential race condition in the XInput backend The race condition could've been triggered on device removal. --- src/joystick/winrt/SDL_xinputjoystick.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/joystick/winrt/SDL_xinputjoystick.c b/src/joystick/winrt/SDL_xinputjoystick.c index 7c2853f29de62..1bb91b27257fa 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;