android: jni: native: Refactor locking for is_running.
This commit is contained in:
		| @@ -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); | ||||
|  | ||||
|         { | ||||
|             std::scoped_lock lock(mutex); | ||||
|             is_running = true; | ||||
|         } | ||||
|  | ||||
|         void(system.Run()); | ||||
|  | ||||
| @@ -140,11 +142,21 @@ public: | ||||
|             system.InitializeDebugger(); | ||||
|         } | ||||
|  | ||||
|         while (!cv.wait_for(lock, std::chrono::seconds(1), [&]() { return !is_running; })) { | ||||
|         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(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     static EmulationSession s_instance; | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user