diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 31 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_process.cpp | 8 |
3 files changed, 37 insertions, 8 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 { | |||
| 112 | old_process->Close(); | 112 | old_process->Close(); |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | process_list.clear(); | 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 | } | ||
| 116 | 123 | ||
| 117 | next_object_id = 0; | 124 | next_object_id = 0; |
| 118 | next_kernel_process_id = KProcess::InitialProcessIdMin; | 125 | next_kernel_process_id = KProcess::InitialProcessIdMin; |
| @@ -770,6 +777,7 @@ struct KernelCore::Impl { | |||
| 770 | std::atomic<u64> next_thread_id{1}; | 777 | std::atomic<u64> next_thread_id{1}; |
| 771 | 778 | ||
| 772 | // Lists all processes that exist in the current session. | 779 | // Lists all processes that exist in the current session. |
| 780 | std::mutex process_list_lock; | ||
| 773 | std::vector<KProcess*> process_list; | 781 | std::vector<KProcess*> process_list; |
| 774 | std::atomic<KProcess*> application_process{}; | 782 | std::atomic<KProcess*> application_process{}; |
| 775 | std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; | 783 | std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; |
| @@ -869,9 +877,19 @@ KResourceLimit* KernelCore::GetSystemResourceLimit() { | |||
| 869 | } | 877 | } |
| 870 | 878 | ||
| 871 | void KernelCore::AppendNewProcess(KProcess* process) { | 879 | void KernelCore::AppendNewProcess(KProcess* process) { |
| 880 | process->Open(); | ||
| 881 | |||
| 882 | std::scoped_lock lk{impl->process_list_lock}; | ||
| 872 | impl->process_list.push_back(process); | 883 | impl->process_list.push_back(process); |
| 873 | } | 884 | } |
| 874 | 885 | ||
| 886 | void KernelCore::RemoveProcess(KProcess* process) { | ||
| 887 | std::scoped_lock lk{impl->process_list_lock}; | ||
| 888 | if (std::erase(impl->process_list, process)) { | ||
| 889 | process->Close(); | ||
| 890 | } | ||
| 891 | } | ||
| 892 | |||
| 875 | void KernelCore::MakeApplicationProcess(KProcess* process) { | 893 | void KernelCore::MakeApplicationProcess(KProcess* process) { |
| 876 | impl->MakeApplicationProcess(process); | 894 | impl->MakeApplicationProcess(process); |
| 877 | } | 895 | } |
| @@ -884,8 +902,15 @@ const KProcess* KernelCore::ApplicationProcess() const { | |||
| 884 | return impl->application_process; | 902 | return impl->application_process; |
| 885 | } | 903 | } |
| 886 | 904 | ||
| 887 | const std::vector<KProcess*>& KernelCore::GetProcessList() const { | 905 | std::list<KScopedAutoObject<KProcess>> KernelCore::GetProcessList() { |
| 888 | return impl->process_list; | 906 | std::list<KScopedAutoObject<KProcess>> processes; |
| 907 | std::scoped_lock lk{impl->process_list_lock}; | ||
| 908 | |||
| 909 | for (auto* const process : impl->process_list) { | ||
| 910 | processes.emplace_back(process); | ||
| 911 | } | ||
| 912 | |||
| 913 | return processes; | ||
| 889 | } | 914 | } |
| 890 | 915 | ||
| 891 | Kernel::GlobalSchedulerContext& KernelCore::GlobalSchedulerContext() { | 916 | Kernel::GlobalSchedulerContext& KernelCore::GlobalSchedulerContext() { |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 5d4102145..8ea5bed1c 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | #include <array> | 6 | #include <array> |
| 7 | #include <functional> | 7 | #include <functional> |
| 8 | #include <list> | ||
| 8 | #include <memory> | 9 | #include <memory> |
| 9 | #include <string> | 10 | #include <string> |
| 10 | #include <unordered_map> | 11 | #include <unordered_map> |
| @@ -116,8 +117,9 @@ public: | |||
| 116 | /// Retrieves a shared pointer to the system resource limit instance. | 117 | /// Retrieves a shared pointer to the system resource limit instance. |
| 117 | KResourceLimit* GetSystemResourceLimit(); | 118 | KResourceLimit* GetSystemResourceLimit(); |
| 118 | 119 | ||
| 119 | /// Adds the given shared pointer to an internal list of active processes. | 120 | /// Adds/removes the given pointer to an internal list of active processes. |
| 120 | void AppendNewProcess(KProcess* process); | 121 | void AppendNewProcess(KProcess* process); |
| 122 | void RemoveProcess(KProcess* process); | ||
| 121 | 123 | ||
| 122 | /// Makes the given process the new application process. | 124 | /// Makes the given process the new application process. |
| 123 | void MakeApplicationProcess(KProcess* process); | 125 | void MakeApplicationProcess(KProcess* process); |
| @@ -129,7 +131,7 @@ public: | |||
| 129 | const KProcess* ApplicationProcess() const; | 131 | const KProcess* ApplicationProcess() const; |
| 130 | 132 | ||
| 131 | /// Retrieves the list of processes. | 133 | /// Retrieves the list of processes. |
| 132 | const std::vector<KProcess*>& GetProcessList() const; | 134 | std::list<KScopedAutoObject<KProcess>> GetProcessList(); |
| 133 | 135 | ||
| 134 | /// Gets the sole instance of the global scheduler | 136 | /// Gets the sole instance of the global scheduler |
| 135 | Kernel::GlobalSchedulerContext& GlobalSchedulerContext(); | 137 | Kernel::GlobalSchedulerContext& GlobalSchedulerContext(); |
diff --git a/src/core/hle/kernel/svc/svc_process.cpp b/src/core/hle/kernel/svc/svc_process.cpp index caa8bee9a..5c3e8829f 100644 --- a/src/core/hle/kernel/svc/svc_process.cpp +++ b/src/core/hle/kernel/svc/svc_process.cpp | |||
| @@ -74,13 +74,15 @@ Result GetProcessList(Core::System& system, s32* out_num_processes, u64 out_proc | |||
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | auto& memory = GetCurrentMemory(kernel); | 76 | auto& memory = GetCurrentMemory(kernel); |
| 77 | const auto& process_list = kernel.GetProcessList(); | 77 | auto process_list = kernel.GetProcessList(); |
| 78 | auto it = process_list.begin(); | ||
| 79 | |||
| 78 | const auto num_processes = process_list.size(); | 80 | const auto num_processes = process_list.size(); |
| 79 | const auto copy_amount = | 81 | const auto copy_amount = |
| 80 | std::min(static_cast<std::size_t>(out_process_ids_size), num_processes); | 82 | std::min(static_cast<std::size_t>(out_process_ids_size), num_processes); |
| 81 | 83 | ||
| 82 | for (std::size_t i = 0; i < copy_amount; ++i) { | 84 | for (std::size_t i = 0; i < copy_amount && it != process_list.end(); ++i, ++it) { |
| 83 | memory.Write64(out_process_ids, process_list[i]->GetProcessId()); | 85 | memory.Write64(out_process_ids, (*it)->GetProcessId()); |
| 84 | out_process_ids += sizeof(u64); | 86 | out_process_ids += sizeof(u64); |
| 85 | } | 87 | } |
| 86 | 88 | ||