فهرست منبع

WinRT: prevented a potential race condition in the XInput backend

The race condition could've been triggered on device removal.
David Ludwig 12 سال پیش
والد
کامیت
ca867fc92d
1فایلهای تغییر یافته به همراه4 افزوده شده و 2 حذف شده
  1. 4 2
      src/joystick/winrt/SDL_xinputjoystick.c

+ 4 - 2
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;