From d553fd4c3aaa947588954751cb07197b5c58fa4c Mon Sep 17 00:00:00 2001 From: bunnei Date: Wed, 25 Jan 2023 19:00:11 -0800 Subject: android: jni: native: Refactor locking for is_running. --- src/android/app/src/main/jni/native.cpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index f1a70c35c..119c7cd01 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -61,6 +61,7 @@ public: } bool IsRunning() const { + std::scoped_lock lock(mutex); return is_running; } @@ -130,9 +131,10 @@ public: } void RunEmulation() { - std::unique_lock lock(mutex); - - is_running = true; + { + std::scoped_lock lock(mutex); + is_running = true; + } void(system.Run()); @@ -140,9 +142,19 @@ public: system.InitializeDebugger(); } - while (!cv.wait_for(lock, std::chrono::seconds(1), [&]() { return !is_running; })) { - std::scoped_lock perf_stats_lock(perf_stats_mutex); - perf_stats = system.GetAndResetPerfStats(); + while (true) { + { + std::unique_lock lock(mutex); + if (cv.wait_for(lock, std::chrono::seconds(1), [&]() { return !is_running; })) { + // Emulation halted. + break; + } + } + { + // Refresh performance stats. + std::scoped_lock perf_stats_lock(perf_stats_mutex); + perf_stats = system.GetAndResetPerfStats(); + } } } @@ -156,12 +168,13 @@ private: Core::System system; Core::PerfStatsResults perf_stats{}; - mutable std::mutex perf_stats_mutex; std::unique_ptr window; - std::mutex mutex; std::condition_variable_any cv; bool is_running{}; + + mutable std::mutex perf_stats_mutex; + mutable std::mutex mutex; }; /*static*/ EmulationSession EmulationSession::s_instance; -- cgit v1.2.3