Kaynağa Gözat

WinRT: prevented a potential race condition in the XInput backend

The race condition could've been triggered on device removal.
David Ludwig 11 yıl önce
ebeveyn
işleme
ca867fc92d
1 değiştirilmiş dosya ile 4 ekleme ve 2 silme
  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;