|
|
|
@ -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() { |
|
|
|
|