Jelajahi Sumber

core: hle: kernel: Allocate dummy threads on host thread storage.

- Fixes a crash where on subsequent boots, long-lived host threads would have their dummy threads freed.
bunnei 4 tahun lalu
induk
melakukan
5f3e77d93e
2 mengubah file dengan 6 tambahan dan 8 penghapusan
  1. 5 4
      src/core/hle/kernel/kernel.cpp
  2. 1 4
      src/core/hle/kernel/service_thread.cpp

+ 5 - 4
src/core/hle/kernel/kernel.cpp

@@ -283,15 +283,16 @@ struct KernelCore::Impl {
 
 
     // Gets the dummy KThread for the caller, allocating a new one if this is the first time
     // Gets the dummy KThread for the caller, allocating a new one if this is the first time
     KThread* GetHostDummyThread() {
     KThread* GetHostDummyThread() {
-        auto make_thread = [this]() {
-            KThread* thread = KThread::Create(system.Kernel());
+        auto initialize = [this](KThread* thread) {
             ASSERT(KThread::InitializeDummyThread(thread).IsSuccess());
             ASSERT(KThread::InitializeDummyThread(thread).IsSuccess());
             thread->SetName(fmt::format("DummyThread:{}", GetHostThreadId()));
             thread->SetName(fmt::format("DummyThread:{}", GetHostThreadId()));
             return thread;
             return thread;
         };
         };
 
 
-        thread_local KThread* saved_thread = make_thread();
-        return saved_thread;
+        thread_local auto raw_thread = KThread(system.Kernel());
+        thread_local auto thread = initialize(&raw_thread);
+
+        return thread;
     }
     }
 
 
     /// Registers a CPU core thread by allocating a host thread ID for it
     /// Registers a CPU core thread by allocating a host thread ID for it

+ 1 - 4
src/core/hle/kernel/service_thread.cpp

@@ -49,12 +49,9 @@ ServiceThread::Impl::Impl(KernelCore& kernel, std::size_t num_threads, const std
                 return;
                 return;
             }
             }
 
 
+            // Allocate a dummy guest thread for this host thread.
             kernel.RegisterHostThread();
             kernel.RegisterHostThread();
 
 
-            // Ensure the dummy thread allocated for this host thread is closed on exit.
-            auto* dummy_thread = kernel.GetCurrentEmuThread();
-            SCOPE_EXIT({ dummy_thread->Close(); });
-
             while (true) {
             while (true) {
                 std::function<void()> task;
                 std::function<void()> task;