From 39ab81a098a28a229b254f6ff82e0a02c9de5c81 Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 29 Jan 2023 02:10:45 -0800 Subject: android: Harden emulation shutdown when loader fails. --- src/android/app/src/main/jni/native.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 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 e1b771468..f0df6cac1 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -96,8 +96,7 @@ public: system.GetFileSystemController().CreateFactories(*system.GetFilesystem()); // Load the ROM. - const Core::SystemResultStatus load_result{ - system.Load(EmulationSession::GetInstance().Window(), filepath)}; + load_result = system.Load(EmulationSession::GetInstance().Window(), filepath); if (load_result != Core::SystemResultStatus::Success) { return load_result; } @@ -113,13 +112,18 @@ public: void ShutdownEmulation() { std::scoped_lock lock(mutex); + is_running = false; + // Unload user input. system.HIDCore().UnloadInputDevices(); // Shutdown the main emulated process - system.DetachDebugger(); - system.ShutdownMainProcess(); - detached_tasks.WaitForAllTasks(); + if (load_result == Core::SystemResultStatus::Success) { + system.DetachDebugger(); + system.ShutdownMainProcess(); + detached_tasks.WaitForAllTasks(); + load_result = Core::SystemResultStatus::ErrorNotInitialized; + } // Tear down the render window. window.reset(); @@ -174,6 +178,7 @@ private: std::unique_ptr window; std::condition_variable_any cv; bool is_running{}; + Core::SystemResultStatus load_result{Core::SystemResultStatus::ErrorNotInitialized}; mutable std::mutex perf_stats_mutex; mutable std::mutex mutex; @@ -217,13 +222,14 @@ static Core::SystemResultStatus RunEmulation(const std::string& filepath) { return Core::SystemResultStatus::ErrorLoader; } + SCOPE_EXIT({ EmulationSession::GetInstance().ShutdownEmulation(); }); + const auto result = EmulationSession::GetInstance().InitializeEmulation(filepath); if (result != Core::SystemResultStatus::Success) { return result; } EmulationSession::GetInstance().RunEmulation(); - EmulationSession::GetInstance().ShutdownEmulation(); return Core::SystemResultStatus::Success; } -- cgit v1.2.3