|
|
|
@ -1,3 +1,6 @@ |
|
|
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
@ -25,19 +28,15 @@ constexpr u64 NO_PROCESS_FOUND_PID{0}; |
|
|
|
using ProcessList = std::list<Kernel::KScopedAutoObject<Kernel::KProcess>>; |
|
|
|
|
|
|
|
template <typename F> |
|
|
|
Kernel::KScopedAutoObject<Kernel::KProcess> SearchProcessList(ProcessList& process_list, |
|
|
|
F&& predicate) { |
|
|
|
const auto iter = std::find_if(process_list.begin(), process_list.end(), predicate); |
|
|
|
|
|
|
|
if (iter == process_list.end()) { |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
return iter->GetPointerUnsafe(); |
|
|
|
Kernel::KScopedAutoObject<Kernel::KProcess> SearchProcessList(Kernel::KernelCore& kernel, ProcessList& process_list, F&& predicate) { |
|
|
|
auto const it = std::find_if(process_list.begin(), process_list.end(), predicate); |
|
|
|
if (it == process_list.end()) |
|
|
|
return {kernel, nullptr}; |
|
|
|
return {kernel, it->GetPointerUnsafe()}; |
|
|
|
} |
|
|
|
|
|
|
|
void GetApplicationPidGeneric(HLERequestContext& ctx, ProcessList& process_list) { |
|
|
|
auto process = SearchProcessList(process_list, [](auto& p) { return p->IsApplication(); }); |
|
|
|
void GetApplicationPidGeneric(Kernel::KernelCore& kernel, HLERequestContext& ctx, ProcessList& process_list) { |
|
|
|
auto process = SearchProcessList(kernel, process_list, [](auto& p) { return p->IsApplication(); }); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 4}; |
|
|
|
rb.Push(ResultSuccess); |
|
|
|
@ -105,7 +104,7 @@ private: |
|
|
|
LOG_DEBUG(Service_PM, "called, program_id={:016X}", program_id); |
|
|
|
|
|
|
|
auto list = kernel.GetProcessList(); |
|
|
|
auto process = SearchProcessList( |
|
|
|
auto process = SearchProcessList(system.Kernel(), |
|
|
|
list, [program_id](auto& p) { return p->GetProgramId() == program_id; }); |
|
|
|
|
|
|
|
if (process.IsNull()) { |
|
|
|
@ -122,7 +121,7 @@ private: |
|
|
|
void GetApplicationProcessId(HLERequestContext& ctx) { |
|
|
|
LOG_DEBUG(Service_PM, "called"); |
|
|
|
auto list = kernel.GetProcessList(); |
|
|
|
GetApplicationPidGeneric(ctx, list); |
|
|
|
GetApplicationPidGeneric(system.Kernel(), ctx, list); |
|
|
|
} |
|
|
|
|
|
|
|
void AtmosphereGetProcessInfo(HLERequestContext& ctx) { |
|
|
|
@ -134,7 +133,7 @@ private: |
|
|
|
LOG_WARNING(Service_PM, "(Partial Implementation) called, pid={:016X}", pid); |
|
|
|
|
|
|
|
auto list = kernel.GetProcessList(); |
|
|
|
auto process = SearchProcessList(list, [pid](auto& p) { return p->GetProcessId() == pid; }); |
|
|
|
auto process = SearchProcessList(system.Kernel(), list, [pid](auto& p) { return p->GetProcessId() == pid; }); |
|
|
|
|
|
|
|
if (process.IsNull()) { |
|
|
|
IPC::ResponseBuilder rb{ctx, 2}; |
|
|
|
@ -188,7 +187,7 @@ private: |
|
|
|
LOG_DEBUG(Service_PM, "called, process_id={:016X}", process_id); |
|
|
|
|
|
|
|
auto list = kernel.GetProcessList(); |
|
|
|
auto process = SearchProcessList( |
|
|
|
auto process = SearchProcessList(system.Kernel(), |
|
|
|
list, [process_id](auto& p) { return p->GetProcessId() == process_id; }); |
|
|
|
|
|
|
|
if (process.IsNull()) { |
|
|
|
@ -209,7 +208,7 @@ private: |
|
|
|
LOG_DEBUG(Service_PM, "called, program_id={:016X}", program_id); |
|
|
|
|
|
|
|
auto list = system.Kernel().GetProcessList(); |
|
|
|
auto process = SearchProcessList( |
|
|
|
auto process = SearchProcessList(system.Kernel(), |
|
|
|
list, [program_id](auto& p) { return p->GetProgramId() == program_id; }); |
|
|
|
|
|
|
|
if (process.IsNull()) { |
|
|
|
@ -249,7 +248,7 @@ private: |
|
|
|
void GetApplicationProcessIdForShell(HLERequestContext& ctx) { |
|
|
|
LOG_DEBUG(Service_PM, "called"); |
|
|
|
auto list = kernel.GetProcessList(); |
|
|
|
GetApplicationPidGeneric(ctx, list); |
|
|
|
GetApplicationPidGeneric(system.Kernel(), ctx, list); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
|