From d3ea35f528b8d0357634ebd8cf949b9bef8cf12a Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 26 Apr 2020 04:03:21 -0400 Subject: [PATCH] android: native: Ensure shutdown on exit. --- src/android/app/src/main/jni/native.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 94257c964..5d31440dc 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -90,10 +90,25 @@ static int AlertPromptButton() { static Camera::NDK::Factory* g_ndk_factory{}; +static void TryShutdown() { + if (!window) { + return; + } + + window->StopPresenting(); + window->DoneCurrent(); + Core::System::GetInstance().Shutdown(); + window.reset(); + InputManager::Shutdown(); + MicroProfileShutdown(); +} + static Core::System::ResultStatus RunCitra(const std::string& filepath) { // Citra core only supports a single running instance std::lock_guard lock(running_mutex); + TryShutdown(); + LOG_INFO(Frontend, "Citra is Starting"); MicroProfileOnThreadCreate("EmuThread"); @@ -136,6 +151,9 @@ static Core::System::ResultStatus RunCitra(const std::string& filepath) { pause_emulation = false; window->StartPresenting(); + + SCOPE_EXIT({TryShutdown();}); + while (is_running) { if (!pause_emulation) { system.RunLoop(); @@ -149,12 +167,6 @@ static Core::System::ResultStatus RunCitra(const std::string& filepath) { running_cv.wait(pause_lock, [] { return !pause_emulation || !is_running; }); } } - window->StopPresenting(); - - system.Shutdown(); - window.reset(); - InputManager::Shutdown(); - MicroProfileShutdown(); return Core::System::ResultStatus::Success; }