aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei <bunneidev@gmail.com>2015-05-18 18:49:51 -0400
committerGravatar bunnei <bunneidev@gmail.com>2015-05-18 18:49:51 -0400
commit1c3cda5d7e94afd0a74525beb1e0798aa8b79dec (patch)
tree8b1d7d4d2b7b2c242bad6eb277f8b1e01491ebe0 /src
parent859707642eb275b1eeccf07c5e73924feced6579 (diff)
parenta406207cd81c9fc3218f29394e11e7711817c458 (diff)
Merge pull request #783 from jroweboy/cond-wait
Use condition var to properly pause the CPU thread
Diffstat (limited to 'src')
-rw-r--r--src/citra_qt/bootmanager.cpp3
-rw-r--r--src/citra_qt/bootmanager.h13
2 files changed, 14 insertions, 2 deletions
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index d3df289f..ab940300 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/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; });
}
}
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index d5d74c94..16809eaa 100644
--- a/src/citra_qt/bootmanager.h
+++ b/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;