From e6f8bde74b9476dced103c6c54ab81616d34b97e Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Wed, 11 Mar 2020 20:44:53 -0400
Subject: [PATCH] General: Fix Stop function

---
 src/core/core_timing.cpp       |  1 +
 src/core/hle/kernel/kernel.cpp | 15 +++++++++++++++
 src/core/hle/kernel/thread.cpp |  8 +++++---
 src/yuzu/bootmanager.cpp       |  6 ++++--
 4 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index c91ae99759..3438f79cee 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -61,6 +61,7 @@ void CoreTiming::Initialize(std::function<void(void)>&& on_thread_init_) {
 void CoreTiming::Shutdown() {
     paused = true;
     shutting_down = true;
+    pause_event.Set();
     event.Set();
     timer_thread->join();
     ClearPendingEvents();
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 2a1b917527..24da4367e4 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -119,6 +119,7 @@ struct KernelCore::Impl {
 
     void Initialize(KernelCore& kernel) {
         Shutdown();
+        RegisterHostThread();
 
         InitializePhysicalCores();
         InitializeSystemResourceLimit(kernel);
@@ -135,6 +136,19 @@ struct KernelCore::Impl {
         next_user_process_id = Process::ProcessIDMin;
         next_thread_id = 1;
 
+        for (std::size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) {
+            if (suspend_threads[i]) {
+                suspend_threads[i].reset();
+            }
+        }
+
+        for (std::size_t i = 0; i < cores.size(); i++) {
+            cores[i].Shutdown();
+        }
+        cores.clear();
+
+        registered_core_threads.reset();
+
         process_list.clear();
         current_process = nullptr;
 
@@ -154,6 +168,7 @@ struct KernelCore::Impl {
         cores.clear();
 
         exclusive_monitor.reset();
+        host_thread_ids.clear();
     }
 
     void InitializePhysicalCores() {
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index 1c32552b12..6f8e7a070a 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -56,10 +56,12 @@ void Thread::Stop() {
         Signal();
         kernel.GlobalHandleTable().Close(global_handle);
 
-        owner_process->UnregisterThread(this);
+        if (owner_process) {
+            owner_process->UnregisterThread(this);
 
-        // Mark the TLS slot in the thread's page as free.
-        owner_process->FreeTLSRegion(tls_address);
+            // Mark the TLS slot in the thread's page as free.
+            owner_process->FreeTLSRegion(tls_address);
+        }
     }
     global_handle = 0;
 }
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp
index 468dde782c..6fad01d50b 100644
--- a/src/yuzu/bootmanager.cpp
+++ b/src/yuzu/bootmanager.cpp
@@ -89,8 +89,10 @@ void EmuThread::run() {
             }
             running_guard = false;
 
-            was_active = true;
-            emit DebugModeEntered();
+            if (!stop_run) {
+                was_active = true;
+                emit DebugModeEntered();
+            }
         } else if (exec_step) {
             UNIMPLEMENTED();
         } else {