Ver código fonte

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 anos atrás
pai
commit
a406207cd8
2 arquivos alterados com 14 adições e 2 exclusões
  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();
             yieldCurrentThread();
             
             
             was_active = false;
             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.
 // Refer to the license.txt file included.
 
 
 #include <atomic>
 #include <atomic>
+#include <condition_variable>
+#include <mutex>
 
 
 #include <QThread>
 #include <QThread>
 #include <QGLWidget>
 #include <QGLWidget>
@@ -40,7 +42,12 @@ public:
      * @param running Boolean value, set the emulation thread to running if true
      * @param running Boolean value, set the emulation thread to running if true
      * @note This function is thread-safe
      * @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
      * Check if the emulation thread is running or not
@@ -54,13 +61,15 @@ public:
      */
      */
     void RequestStop() {
     void RequestStop() {
         stop_run = true;
         stop_run = true;
-        running = false;
+        SetRunning(false);
     };
     };
 
 
 private:
 private:
     bool exec_step;
     bool exec_step;
     bool running;
     bool running;
     std::atomic<bool> stop_run;
     std::atomic<bool> stop_run;
+    std::mutex running_mutex;
+    std::condition_variable running_cv;
 
 
     GRenderWindow* render_window;
     GRenderWindow* render_window;