diff options
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index f3683cdcc..34b25be66 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -97,8 +97,14 @@ struct KernelCore::Impl { | |||
| 97 | RegisterHostThread(nullptr); | 97 | RegisterHostThread(nullptr); |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | void TerminateApplicationProcess() { | 100 | void TerminateAllProcesses() { |
| 101 | application_process.load()->Terminate(); | 101 | std::scoped_lock lk{process_list_lock}; |
| 102 | for (auto& process : process_list) { | ||
| 103 | process->Terminate(); | ||
| 104 | process->Close(); | ||
| 105 | process = nullptr; | ||
| 106 | } | ||
| 107 | process_list.clear(); | ||
| 102 | } | 108 | } |
| 103 | 109 | ||
| 104 | void Shutdown() { | 110 | void Shutdown() { |
| @@ -107,18 +113,9 @@ struct KernelCore::Impl { | |||
| 107 | 113 | ||
| 108 | CloseServices(); | 114 | CloseServices(); |
| 109 | 115 | ||
| 110 | auto* old_process = application_process.exchange(nullptr); | 116 | if (application_process) { |
| 111 | if (old_process) { | 117 | application_process->Close(); |
| 112 | old_process->Close(); | 118 | application_process = nullptr; |
| 113 | } | ||
| 114 | |||
| 115 | { | ||
| 116 | std::scoped_lock lk{process_list_lock}; | ||
| 117 | for (auto* const process : process_list) { | ||
| 118 | process->Terminate(); | ||
| 119 | process->Close(); | ||
| 120 | } | ||
| 121 | process_list.clear(); | ||
| 122 | } | 119 | } |
| 123 | 120 | ||
| 124 | next_object_id = 0; | 121 | next_object_id = 0; |
| @@ -354,6 +351,7 @@ struct KernelCore::Impl { | |||
| 354 | 351 | ||
| 355 | void MakeApplicationProcess(KProcess* process) { | 352 | void MakeApplicationProcess(KProcess* process) { |
| 356 | application_process = process; | 353 | application_process = process; |
| 354 | application_process->Open(); | ||
| 357 | } | 355 | } |
| 358 | 356 | ||
| 359 | static inline thread_local u8 host_thread_id = UINT8_MAX; | 357 | static inline thread_local u8 host_thread_id = UINT8_MAX; |
| @@ -779,7 +777,7 @@ struct KernelCore::Impl { | |||
| 779 | // Lists all processes that exist in the current session. | 777 | // Lists all processes that exist in the current session. |
| 780 | std::mutex process_list_lock; | 778 | std::mutex process_list_lock; |
| 781 | std::vector<KProcess*> process_list; | 779 | std::vector<KProcess*> process_list; |
| 782 | std::atomic<KProcess*> application_process{}; | 780 | KProcess* application_process{}; |
| 783 | std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; | 781 | std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; |
| 784 | std::unique_ptr<Kernel::KHardwareTimer> hardware_timer; | 782 | std::unique_ptr<Kernel::KHardwareTimer> hardware_timer; |
| 785 | 783 | ||
| @@ -1243,7 +1241,7 @@ void KernelCore::SuspendApplication(bool suspended) { | |||
| 1243 | } | 1241 | } |
| 1244 | 1242 | ||
| 1245 | void KernelCore::ShutdownCores() { | 1243 | void KernelCore::ShutdownCores() { |
| 1246 | impl->TerminateApplicationProcess(); | 1244 | impl->TerminateAllProcesses(); |
| 1247 | 1245 | ||
| 1248 | KScopedSchedulerLock lk{*this}; | 1246 | KScopedSchedulerLock lk{*this}; |
| 1249 | 1247 | ||