diff options
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 7307cf262..f23c629dc 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -95,19 +95,7 @@ struct KernelCore::Impl { | |||
| 95 | 95 | ||
| 96 | process_list.clear(); | 96 | process_list.clear(); |
| 97 | 97 | ||
| 98 | // Close all open server sessions and ports. | 98 | CloseServices(); |
| 99 | std::unordered_set<KAutoObject*> server_objects_; | ||
| 100 | { | ||
| 101 | std::scoped_lock lk(server_objects_lock); | ||
| 102 | server_objects_ = server_objects; | ||
| 103 | server_objects.clear(); | ||
| 104 | } | ||
| 105 | for (auto* server_object : server_objects_) { | ||
| 106 | server_object->Close(); | ||
| 107 | } | ||
| 108 | |||
| 109 | // Ensures all service threads gracefully shutdown. | ||
| 110 | ClearServiceThreads(); | ||
| 111 | 99 | ||
| 112 | next_object_id = 0; | 100 | next_object_id = 0; |
| 113 | next_kernel_process_id = KProcess::InitialKIPIDMin; | 101 | next_kernel_process_id = KProcess::InitialKIPIDMin; |
| @@ -191,6 +179,22 @@ struct KernelCore::Impl { | |||
| 191 | global_object_list_container.reset(); | 179 | global_object_list_container.reset(); |
| 192 | } | 180 | } |
| 193 | 181 | ||
| 182 | void CloseServices() { | ||
| 183 | // Close all open server sessions and ports. | ||
| 184 | std::unordered_set<KAutoObject*> server_objects_; | ||
| 185 | { | ||
| 186 | std::scoped_lock lk(server_objects_lock); | ||
| 187 | server_objects_ = server_objects; | ||
| 188 | server_objects.clear(); | ||
| 189 | } | ||
| 190 | for (auto* server_object : server_objects_) { | ||
| 191 | server_object->Close(); | ||
| 192 | } | ||
| 193 | |||
| 194 | // Ensures all service threads gracefully shutdown. | ||
| 195 | ClearServiceThreads(); | ||
| 196 | } | ||
| 197 | |||
| 194 | void InitializePhysicalCores() { | 198 | void InitializePhysicalCores() { |
| 195 | exclusive_monitor = | 199 | exclusive_monitor = |
| 196 | Core::MakeExclusiveMonitor(system.Memory(), Core::Hardware::NUM_CPU_CORES); | 200 | Core::MakeExclusiveMonitor(system.Memory(), Core::Hardware::NUM_CPU_CORES); |
| @@ -813,6 +817,10 @@ void KernelCore::Shutdown() { | |||
| 813 | impl->Shutdown(); | 817 | impl->Shutdown(); |
| 814 | } | 818 | } |
| 815 | 819 | ||
| 820 | void KernelCore::CloseServices() { | ||
| 821 | impl->CloseServices(); | ||
| 822 | } | ||
| 823 | |||
| 816 | const KResourceLimit* KernelCore::GetSystemResourceLimit() const { | 824 | const KResourceLimit* KernelCore::GetSystemResourceLimit() const { |
| 817 | return impl->system_resource_limit; | 825 | return impl->system_resource_limit; |
| 818 | } | 826 | } |