Skip to content
Snippets Groups Projects
Commit a406207c authored by James Rowe's avatar James Rowe
Browse files

Use condition var to properly pause the CPU thread

Adds support for threaded pausing so citra doesn't spin wait on pause
parent 9fb97504
No related branches found
No related tags found
No related merge requests found
......@@ -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; });
}
}
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment