Преглед изворни кода

Use condition var to properly pause the CPU thread

Adds support for threaded pausing so citra doesn't spin wait on pause
James Rowe пре 11 година
родитељ
комит
a406207cd8
2 измењених фајлова са 14 додато и 2 уклоњено
  1. 3 0
      src/citra_qt/bootmanager.cpp
  2. 11 2
      src/citra_qt/bootmanager.h

+ 3 - 0
src/citra_qt/bootmanager.cpp

@@ -59,6 +59,9 @@ void EmuThread::run() {
             yieldCurrentThread();
             
             was_active = false;
+        } else {
+            std::unique_lock<std::mutex> lock(running_mutex);
+            running_cv.wait(lock, [this]{ return IsRunning() || stop_run; });
         }
     }
 

+ 11 - 2
src/citra_qt/bootmanager.h

@@ -3,6 +3,8 @@
 // Refer to the license.txt file included.
 
 #include <atomic>
+#include <condition_variable>
+#include <mutex>
 
 #include <QThread>
 #include <QGLWidget>
@@ -40,7 +42,12 @@ public:
      * @param running Boolean value, set the emulation thread to running if true
      * @note This function is thread-safe
      */
-    void SetRunning(bool running) { this->running = running; }
+    void SetRunning(bool running) {
+        std::unique_lock<std::mutex> lock(running_mutex);
+        this->running = running;
+        lock.unlock();
+        running_cv.notify_all();
+    }
 
     /**
      * Check if the emulation thread is running or not
@@ -54,13 +61,15 @@ public:
      */
     void RequestStop() {
         stop_run = true;
-        running = false;
+        SetRunning(false);
     };
 
 private:
     bool exec_step;
     bool running;
     std::atomic<bool> stop_run;
+    std::mutex running_mutex;
+    std::condition_variable running_cv;
 
     GRenderWindow* render_window;