Просмотр исходного кода

android: jni: native: Refactor locking for is_running.

bunnei 3 лет назад
Родитель
Сommit
d553fd4c3a
1 измененных файлов с 21 добавлено и 8 удалено
  1. 21 8
      src/android/app/src/main/jni/native.cpp

+ 21 - 8
src/android/app/src/main/jni/native.cpp

@@ -61,6 +61,7 @@ public:
     }
     }
 
 
     bool IsRunning() const {
     bool IsRunning() const {
+        std::scoped_lock lock(mutex);
         return is_running;
         return is_running;
     }
     }
 
 
@@ -130,9 +131,10 @@ public:
     }
     }
 
 
     void RunEmulation() {
     void RunEmulation() {
-        std::unique_lock lock(mutex);
-
-        is_running = true;
+        {
+            std::scoped_lock lock(mutex);
+            is_running = true;
+        }
 
 
         void(system.Run());
         void(system.Run());
 
 
@@ -140,9 +142,19 @@ public:
             system.InitializeDebugger();
             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::System system;
 
 
     Core::PerfStatsResults perf_stats{};
     Core::PerfStatsResults perf_stats{};
-    mutable std::mutex perf_stats_mutex;
 
 
     std::unique_ptr<EmuWindow_Android> window;
     std::unique_ptr<EmuWindow_Android> window;
-    std::mutex mutex;
     std::condition_variable_any cv;
     std::condition_variable_any cv;
     bool is_running{};
     bool is_running{};
+
+    mutable std::mutex perf_stats_mutex;
+    mutable std::mutex mutex;
 };
 };
 
 
 /*static*/ EmulationSession EmulationSession::s_instance;
 /*static*/ EmulationSession EmulationSession::s_instance;