Răsfoiți Sursa

Merge pull request #9601 from liamwhite/it-never-ends

qt: unlock during signal emission
liamwhite 3 ani în urmă
părinte
comite
0eae0b6803
2 a modificat fișierele cu 21 adăugiri și 2 ștergeri
  1. 17 2
      src/yuzu/bootmanager.cpp
  2. 4 0
      src/yuzu/bootmanager.h

+ 17 - 2
src/yuzu/bootmanager.cpp

@@ -96,9 +96,9 @@ void EmuThread::run() {
             m_is_running.store(false);
             m_is_running.notify_all();
 
-            emit DebugModeEntered();
+            EmulationPaused(lk);
             Common::CondvarWait(m_should_run_cv, lk, stop_token, [&] { return m_should_run; });
-            emit DebugModeLeft();
+            EmulationResumed(lk);
         }
     }
 
@@ -111,6 +111,21 @@ void EmuThread::run() {
 #endif
 }
 
+// Unlock while emitting signals so that the main thread can
+// continue pumping events.
+
+void EmuThread::EmulationPaused(std::unique_lock<std::mutex>& lk) {
+    lk.unlock();
+    emit DebugModeEntered();
+    lk.lock();
+}
+
+void EmuThread::EmulationResumed(std::unique_lock<std::mutex>& lk) {
+    lk.unlock();
+    emit DebugModeLeft();
+    lk.lock();
+}
+
 #ifdef HAS_OPENGL
 class OpenGLSharedContext : public Core::Frontend::GraphicsContext {
 public:

+ 4 - 0
src/yuzu/bootmanager.h

@@ -91,6 +91,10 @@ public:
         m_stop_source.request_stop();
     }
 
+private:
+    void EmulationPaused(std::unique_lock<std::mutex>& lk);
+    void EmulationResumed(std::unique_lock<std::mutex>& lk);
+
 private:
     Core::System& m_system;