From 179adee396e6b8480d52be5314979830beebfbc1 Mon Sep 17 00:00:00 2001
From: Liam <byteslice@airmail.cc>
Date: Mon, 12 Dec 2022 21:38:20 -0500
Subject: [PATCH] emu_thread: properly force shutdown for unresponsive guest
 programs

---
 src/yuzu/bootmanager.h | 11 +----------
 src/yuzu/main.cpp      |  6 ++++--
 2 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h
index c2b127f192..f0edad6e4c 100644
--- a/src/yuzu/bootmanager.h
+++ b/src/yuzu/bootmanager.h
@@ -11,7 +11,6 @@
 #include <QImage>
 #include <QStringList>
 #include <QThread>
-#include <QTimer>
 #include <QTouchEvent>
 #include <QWidget>
 
@@ -85,17 +84,9 @@ public:
     }
 
     /**
-     * Requests for the emulation thread to stop running
+     * Requests for the emulation thread to immediately 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 b38957d9a2..b3ae03eaf5 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -1792,12 +1792,14 @@ void GMainWindow::ShutdownGame() {
     discord_rpc->Pause();
 
     RequestGameExit();
-    emu_thread->RequestStop();
 
     emit EmulationStopping();
 
     // Wait for emulation thread to complete and delete it
-    emu_thread->wait();
+    if (!emu_thread->wait(5000)) {
+        emu_thread->ForceStop();
+        emu_thread->wait();
+    }
     emu_thread = nullptr;
 
     emulation_running = false;