diff options
-rw-r--r-- | src/core/hle/kernel/kernel.cpp | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 1225e1fba..e1e17db13 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -121,7 +121,7 @@ struct KernelCore::Impl { object_list_container.Finalize(); // Ensures all service threads gracefully shutdown. - service_threads.clear(); + ClearServiceThreads(); next_object_id = 0; next_kernel_process_id = KProcess::InitialKIPIDMin; @@ -704,11 +704,35 @@ struct KernelCore::Impl { return port; } + std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, + const std::string& name) { + auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, 1, name); + { + std::lock_guard lk(service_threads_lock); + service_threads.emplace(service_thread); + } + return service_thread; + } + + void ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { + auto strong_ptr = service_thread.lock(); + { + std::lock_guard lk(service_threads_lock); + service_threads.erase(strong_ptr); + } + } + + void ClearServiceThreads() { + std::lock_guard lk(service_threads_lock); + service_threads.clear(); + } + std::mutex server_ports_lock; std::mutex server_sessions_lock; std::mutex registered_objects_lock; std::mutex registered_in_use_objects_lock; std::mutex dummy_thread_lock; + std::mutex service_threads_lock; std::atomic<u32> next_object_id{0}; std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin}; @@ -1099,15 +1123,11 @@ void KernelCore::ExitSVCProfile() { } std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) { - auto service_thread = std::make_shared<Kernel::ServiceThread>(*this, 1, name); - impl->service_threads.emplace(service_thread); - return service_thread; + return impl->CreateServiceThread(*this, name); } void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { - if (auto strong_ptr = service_thread.lock()) { - impl->service_threads.erase(strong_ptr); - } + impl->ReleaseServiceThread(service_thread); } Init::KSlabResourceCounts& KernelCore::SlabResourceCounts() { |