diff options
author | Liam <byteslice@airmail.cc> | 2024-01-02 23:12:16 +0100 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2024-01-13 00:31:33 +0100 |
commit | f90a022d3a20c86399f49a8154847b73bc1b8fd3 (patch) | |
tree | 672214411189aaf408febc5aa9cc01e45aed5f5f /src/core/hle/kernel/kernel.cpp | |
parent | kernel: fix page leak on process termination (diff) | |
download | yuzu-f90a022d3a20c86399f49a8154847b73bc1b8fd3.tar yuzu-f90a022d3a20c86399f49a8154847b73bc1b8fd3.tar.gz yuzu-f90a022d3a20c86399f49a8154847b73bc1b8fd3.tar.bz2 yuzu-f90a022d3a20c86399f49a8154847b73bc1b8fd3.tar.lz yuzu-f90a022d3a20c86399f49a8154847b73bc1b8fd3.tar.xz yuzu-f90a022d3a20c86399f49a8154847b73bc1b8fd3.tar.zst yuzu-f90a022d3a20c86399f49a8154847b73bc1b8fd3.zip |
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r-- | src/core/hle/kernel/kernel.cpp | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 1030f0c12..f3683cdcc 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -112,7 +112,14 @@ struct KernelCore::Impl { old_process->Close(); } - process_list.clear(); + { + std::scoped_lock lk{process_list_lock}; + for (auto* const process : process_list) { + process->Terminate(); + process->Close(); + } + process_list.clear(); + } next_object_id = 0; next_kernel_process_id = KProcess::InitialProcessIdMin; @@ -770,6 +777,7 @@ struct KernelCore::Impl { std::atomic<u64> next_thread_id{1}; // Lists all processes that exist in the current session. + std::mutex process_list_lock; std::vector<KProcess*> process_list; std::atomic<KProcess*> application_process{}; std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; @@ -869,9 +877,19 @@ KResourceLimit* KernelCore::GetSystemResourceLimit() { } void KernelCore::AppendNewProcess(KProcess* process) { + process->Open(); + + std::scoped_lock lk{impl->process_list_lock}; impl->process_list.push_back(process); } +void KernelCore::RemoveProcess(KProcess* process) { + std::scoped_lock lk{impl->process_list_lock}; + if (std::erase(impl->process_list, process)) { + process->Close(); + } +} + void KernelCore::MakeApplicationProcess(KProcess* process) { impl->MakeApplicationProcess(process); } @@ -884,8 +902,15 @@ const KProcess* KernelCore::ApplicationProcess() const { return impl->application_process; } -const std::vector<KProcess*>& KernelCore::GetProcessList() const { - return impl->process_list; +std::list<KScopedAutoObject<KProcess>> KernelCore::GetProcessList() { + std::list<KScopedAutoObject<KProcess>> processes; + std::scoped_lock lk{impl->process_list_lock}; + + for (auto* const process : impl->process_list) { + processes.emplace_back(process); + } + + return processes; } Kernel::GlobalSchedulerContext& KernelCore::GlobalSchedulerContext() { |