summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp34
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 {
121 object_list_container.Finalize(); 121 object_list_container.Finalize();
122 122
123 // Ensures all service threads gracefully shutdown. 123 // Ensures all service threads gracefully shutdown.
124 service_threads.clear(); 124 ClearServiceThreads();
125 125
126 next_object_id = 0; 126 next_object_id = 0;
127 next_kernel_process_id = KProcess::InitialKIPIDMin; 127 next_kernel_process_id = KProcess::InitialKIPIDMin;
@@ -704,11 +704,35 @@ struct KernelCore::Impl {
704 return port; 704 return port;
705 } 705 }
706 706
707 std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel,
708 const std::string& name) {
709 auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, 1, name);
710 {
711 std::lock_guard lk(service_threads_lock);
712 service_threads.emplace(service_thread);
713 }
714 return service_thread;
715 }
716
717 void ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) {
718 auto strong_ptr = service_thread.lock();
719 {
720 std::lock_guard lk(service_threads_lock);
721 service_threads.erase(strong_ptr);
722 }
723 }
724
725 void ClearServiceThreads() {
726 std::lock_guard lk(service_threads_lock);
727 service_threads.clear();
728 }
729
707 std::mutex server_ports_lock; 730 std::mutex server_ports_lock;
708 std::mutex server_sessions_lock; 731 std::mutex server_sessions_lock;
709 std::mutex registered_objects_lock; 732 std::mutex registered_objects_lock;
710 std::mutex registered_in_use_objects_lock; 733 std::mutex registered_in_use_objects_lock;
711 std::mutex dummy_thread_lock; 734 std::mutex dummy_thread_lock;
735 std::mutex service_threads_lock;
712 736
713 std::atomic<u32> next_object_id{0}; 737 std::atomic<u32> next_object_id{0};
714 std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin}; 738 std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin};
@@ -1099,15 +1123,11 @@ void KernelCore::ExitSVCProfile() {
1099} 1123}
1100 1124
1101std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) { 1125std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) {
1102 auto service_thread = std::make_shared<Kernel::ServiceThread>(*this, 1, name); 1126 return impl->CreateServiceThread(*this, name);
1103 impl->service_threads.emplace(service_thread);
1104 return service_thread;
1105} 1127}
1106 1128
1107void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { 1129void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) {
1108 if (auto strong_ptr = service_thread.lock()) { 1130 impl->ReleaseServiceThread(service_thread);
1109 impl->service_threads.erase(strong_ptr);
1110 }
1111} 1131}
1112 1132
1113Init::KSlabResourceCounts& KernelCore::SlabResourceCounts() { 1133Init::KSlabResourceCounts& KernelCore::SlabResourceCounts() {