From d553fd4c3aaa947588954751cb07197b5c58fa4c Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Wed, 25 Jan 2023 19:00:11 -0800
Subject: [PATCH] android: jni: native: Refactor locking for is_running.

---
 src/android/app/src/main/jni/native.cpp | 29 ++++++++++++++++++-------
 1 file changed, 21 insertions(+), 8 deletions(-)

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<EmuWindow_Android> 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;