From f44c60321ec767b6e881160d4960345d678edf78 Mon Sep 17 00:00:00 2001 From: Gus Caplan Date: Mon, 18 Jul 2022 00:41:29 -0700 Subject: let games gracefully exit --- src/yuzu/bootmanager.cpp | 5 +++++ src/yuzu/bootmanager.h | 10 ++++++++++ src/yuzu/main.cpp | 5 ++--- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 5b5b6fed8..f7321258c 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -80,6 +80,11 @@ void EmuThread::run() { system.GetCpuManager().OnGpuReady(); + system.RegisterExitCallback([this]() { + stop_source.request_stop(); + SetRunning(false); + }); + // Holds whether the cpu was running during the last iteration, // so that the DebugModeLeft signal can be emitted before the // next execution step diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h index f4deae4ee..c2b127f19 100644 --- a/src/yuzu/bootmanager.h +++ b/src/yuzu/bootmanager.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -87,6 +88,15 @@ public: * Requests for the emulation thread to stop running */ void RequestStop() { + QTimer::singleShot(5000, this, &EmuThread::ForceStop); + } + +private slots: + void ForceStop() { + if (!IsRunning()) { + return; + } + LOG_WARNING(Frontend, "Force stopping EmuThread"); stop_source.request_stop(); SetRunning(false); } diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index b11b26f7b..b38957d9a 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -1707,9 +1707,6 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t system->RegisterExecuteProgramCallback( [this](std::size_t program_index_) { render_window->ExecuteProgram(program_index_); }); - // Register an Exit callback such that Core can exit the currently running application. - system->RegisterExitCallback([this]() { render_window->Exit(); }); - connect(render_window, &GRenderWindow::Closed, this, &GMainWindow::OnStopGame); connect(render_window, &GRenderWindow::MouseActivity, this, &GMainWindow::OnMouseActivity); // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our views @@ -1793,6 +1790,8 @@ void GMainWindow::ShutdownGame() { system->SetShuttingDown(true); system->DetachDebugger(); discord_rpc->Pause(); + + RequestGameExit(); emu_thread->RequestStop(); emit EmulationStopping(); -- cgit v1.2.3