summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/kernel.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index e42a6d36f..45e86a677 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -300,15 +300,16 @@ struct KernelCore::Impl {
300 // Gets the dummy KThread for the caller, allocating a new one if this is the first time 300 // Gets the dummy KThread for the caller, allocating a new one if this is the first time
301 KThread* GetHostDummyThread() { 301 KThread* GetHostDummyThread() {
302 auto make_thread = [this]() { 302 auto make_thread = [this]() {
303 std::unique_ptr<KThread> thread = std::make_unique<KThread>(system.Kernel()); 303 std::lock_guard lk(dummy_thread_lock);
304 auto& thread = dummy_threads.emplace_back(std::make_unique<KThread>(system.Kernel()));
304 KAutoObject::Create(thread.get()); 305 KAutoObject::Create(thread.get());
305 ASSERT(KThread::InitializeDummyThread(thread.get()).IsSuccess()); 306 ASSERT(KThread::InitializeDummyThread(thread.get()).IsSuccess());
306 thread->SetName(fmt::format("DummyThread:{}", GetHostThreadId())); 307 thread->SetName(fmt::format("DummyThread:{}", GetHostThreadId()));
307 return thread; 308 return thread.get();
308 }; 309 };
309 310
310 thread_local auto thread = make_thread(); 311 thread_local KThread* saved_thread = make_thread();
311 return thread.get(); 312 return saved_thread;
312 } 313 }
313 314
314 /// Registers a CPU core thread by allocating a host thread ID for it 315 /// Registers a CPU core thread by allocating a host thread ID for it
@@ -695,6 +696,12 @@ struct KernelCore::Impl {
695 return port; 696 return port;
696 } 697 }
697 698
699 std::mutex server_ports_lock;
700 std::mutex server_sessions_lock;
701 std::mutex registered_objects_lock;
702 std::mutex registered_in_use_objects_lock;
703 std::mutex dummy_thread_lock;
704
698 std::atomic<u32> next_object_id{0}; 705 std::atomic<u32> next_object_id{0};
699 std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin}; 706 std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin};
700 std::atomic<u64> next_user_process_id{KProcess::ProcessIDMin}; 707 std::atomic<u64> next_user_process_id{KProcess::ProcessIDMin};
@@ -725,10 +732,6 @@ struct KernelCore::Impl {
725 std::unordered_set<KServerSession*> server_sessions; 732 std::unordered_set<KServerSession*> server_sessions;
726 std::unordered_set<KAutoObject*> registered_objects; 733 std::unordered_set<KAutoObject*> registered_objects;
727 std::unordered_set<KAutoObject*> registered_in_use_objects; 734 std::unordered_set<KAutoObject*> registered_in_use_objects;
728 std::mutex server_ports_lock;
729 std::mutex server_sessions_lock;
730 std::mutex registered_objects_lock;
731 std::mutex registered_in_use_objects_lock;
732 735
733 std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor; 736 std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor;
734 std::vector<Kernel::PhysicalCore> cores; 737 std::vector<Kernel::PhysicalCore> cores;
@@ -753,6 +756,9 @@ struct KernelCore::Impl {
753 std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{}; 756 std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{};
754 std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; 757 std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{};
755 758
759 // Specifically tracked to be automatically destroyed with kernel
760 std::vector<std::unique_ptr<KThread>> dummy_threads;
761
756 bool is_multicore{}; 762 bool is_multicore{};
757 bool is_phantom_mode_for_singlecore{}; 763 bool is_phantom_mode_for_singlecore{};
758 u32 single_core_thread_id{}; 764 u32 single_core_thread_id{};