Răsfoiți Sursa

core: hid: Fix double lock on softlock and forced updates

Narr the Reg 4 ani în urmă
părinte
comite
bbaa08d7f0
1 a modificat fișierele cu 12 adăugiri și 2 ștergeri
  1. 12 2
      src/core/hid/emulated_controller.cpp

+ 12 - 2
src/core/hid/emulated_controller.cpp

@@ -1173,17 +1173,22 @@ DebugPadButton EmulatedController::GetDebugPadButtons() const {
 }
 }
 
 
 AnalogSticks EmulatedController::GetSticks() const {
 AnalogSticks EmulatedController::GetSticks() const {
-    std::scoped_lock lock{mutex};
+    std::unique_lock lock{mutex};
+
     if (is_configuring) {
     if (is_configuring) {
         return {};
         return {};
     }
     }
+
     // Some drivers like stick from buttons need constant refreshing
     // Some drivers like stick from buttons need constant refreshing
     for (auto& device : stick_devices) {
     for (auto& device : stick_devices) {
         if (!device) {
         if (!device) {
             continue;
             continue;
         }
         }
+        lock.unlock();
         device->SoftUpdate();
         device->SoftUpdate();
+        lock.lock();
     }
     }
+
     return controller.analog_stick_state;
     return controller.analog_stick_state;
 }
 }
 
 
@@ -1196,15 +1201,20 @@ NpadGcTriggerState EmulatedController::GetTriggers() const {
 }
 }
 
 
 MotionState EmulatedController::GetMotions() const {
 MotionState EmulatedController::GetMotions() const {
-    std::scoped_lock lock{mutex};
+    std::unique_lock lock{mutex};
+
+    // Some drivers like mouse motion need constant refreshing
     if (force_update_motion) {
     if (force_update_motion) {
         for (auto& device : motion_devices) {
         for (auto& device : motion_devices) {
             if (!device) {
             if (!device) {
                 continue;
                 continue;
             }
             }
+            lock.unlock();
             device->ForceUpdate();
             device->ForceUpdate();
+            lock.lock();
         }
         }
     }
     }
+
     return controller.motion_state;
     return controller.motion_state;
 }
 }