Fernando Sahmkow 6 лет назад
Родитель
Сommit
e6f8bde74b

+ 1 - 0
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();

+ 15 - 0
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() {

+ 5 - 3
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;
 }

+ 4 - 2
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 {