aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/service/am/process_creation.cpp
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-06-23 06:31:25 +0200
committercrueter <crueter@eden-emu.dev>2026-06-23 06:31:25 +0200
commit3aa0d462598beb2021308eee1d757d74fe33b312 (patch)
treeed425c3845ba8fa61184d97b0588cb049b518bd7 /src/core/hle/service/am/process_creation.cpp
parentf8facda35fe7f17143f84bbfbdacc4cc48678946 (diff)
[video_core, hle] remove redundant parent references in system structs (#3908)
reworked a bit to remove references of parent objects and instead pass as arguments to methods to prevent useless reloads Signed-off-by: lizzie <lizzie@eden-emu.dev> Co-authored-by: maufeat <sahyno1996@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3908 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: crueter <crueter@eden-emu.dev>
Diffstat (limited to 'src/core/hle/service/am/process_creation.cpp')
-rw-r--r--src/core/hle/service/am/process_creation.cpp93
1 files changed, 39 insertions, 54 deletions
diff --git a/src/core/hle/service/am/process_creation.cpp b/src/core/hle/service/am/process_creation.cpp
index b5e31353a2..e34e86a82c 100644
--- a/src/core/hle/service/am/process_creation.cpp
+++ b/src/core/hle/service/am/process_creation.cpp
@@ -1,6 +1,10 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
+#include <optional>
#include "core/core.h"
#include "core/file_sys/content_archive.h"
#include "core/file_sys/nca_metadata.h"
@@ -16,7 +20,7 @@ namespace Service::AM {
namespace {
-FileSys::StorageId GetStorageIdForFrontendSlot(
+[[nodiscard]] FileSys::StorageId GetStorageIdForFrontendSlot(
std::optional<FileSys::ContentProviderUnionSlot> slot) {
if (!slot.has_value()) {
return FileSys::StorageId::None;
@@ -36,31 +40,23 @@ FileSys::StorageId GetStorageIdForFrontendSlot(
}
}
-std::unique_ptr<Process> CreateProcessImpl(std::unique_ptr<Loader::AppLoader>& out_loader,
- Loader::ResultStatus& out_load_result,
- Core::System& system, FileSys::VirtualFile file,
- u64 program_id, u64 program_index) {
+[[nodiscard]] inline std::optional<Process> CreateProcessImpl(std::unique_ptr<Loader::AppLoader>& out_loader, Loader::ResultStatus& out_load_result, Core::System& system, FileSys::VirtualFile file, u64 program_id, u64 program_index) {
// Get the appropriate loader to parse this NCA.
out_loader = Loader::GetLoader(system, file, program_id, program_index);
-
// Ensure we have a loader which can parse the NCA.
- if (!out_loader) {
- return nullptr;
- }
-
- // Try to load the process.
- auto process = std::make_unique<Process>(system);
- if (process->Initialize(*out_loader, out_load_result)) {
- return process;
+ if (out_loader) {
+ // Try to load the process.
+ auto process = std::make_optional<Process>(system);
+ if (process->Initialize(*out_loader, out_load_result)) {
+ return process;
+ }
}
-
- return nullptr;
+ return std::nullopt;
}
} // Anonymous namespace
-std::unique_ptr<Process> CreateProcess(Core::System& system, u64 program_id,
- u8 minimum_key_generation, u8 maximum_key_generation) {
+std::optional<Process> CreateProcess(Core::System& system, u64 program_id, u8 minimum_key_generation, u8 maximum_key_generation) {
// Attempt to load program NCA.
FileSys::VirtualFile nca_raw{};
@@ -70,7 +66,7 @@ std::unique_ptr<Process> CreateProcess(Core::System& system, u64 program_id,
// Ensure we retrieved a program NCA.
if (!nca_raw) {
- return nullptr;
+ return std::nullopt;
}
// Ensure we have a suitable version.
@@ -79,9 +75,8 @@ std::unique_ptr<Process> CreateProcess(Core::System& system, u64 program_id,
if (nca.GetStatus() == Loader::ResultStatus::Success &&
(nca.GetKeyGeneration() < minimum_key_generation ||
nca.GetKeyGeneration() > maximum_key_generation)) {
- LOG_WARNING(Service_LDR, "Skipping program {:016X} with generation {}", program_id,
- nca.GetKeyGeneration());
- return nullptr;
+ LOG_WARNING(Service_LDR, "Skipping program {:016X} with generation {}", program_id, nca.GetKeyGeneration());
+ return std::nullopt;
}
}
@@ -90,42 +85,32 @@ std::unique_ptr<Process> CreateProcess(Core::System& system, u64 program_id,
return CreateProcessImpl(loader, status, system, nca_raw, program_id, 0);
}
-std::unique_ptr<Process> CreateApplicationProcess(std::vector<u8>& out_control,
- std::unique_ptr<Loader::AppLoader>& out_loader,
- Loader::ResultStatus& out_load_result,
- Core::System& system, FileSys::VirtualFile file,
- u64 program_id, u64 program_index) {
- auto process =
- CreateProcessImpl(out_loader, out_load_result, system, file, program_id, program_index);
- if (!process) {
- return nullptr;
- }
-
- FileSys::NACP nacp;
- if (out_loader->ReadControlData(nacp) == Loader::ResultStatus::Success) {
- out_control = nacp.GetRawBytes();
- } else {
- out_control.resize(sizeof(FileSys::RawNACP));
- std::fill(out_control.begin(), out_control.end(), (u8) 0);
- }
-
- auto& storage = system.GetContentProviderUnion();
- Service::Glue::ApplicationLaunchProperty launch{};
- launch.title_id = process->GetProgramId();
+std::optional<Process> CreateApplicationProcess(std::vector<u8>& out_control, std::unique_ptr<Loader::AppLoader>& out_loader, Loader::ResultStatus& out_load_result, Core::System& system, FileSys::VirtualFile file, u64 program_id, u64 program_index) {
+ if (auto process = CreateProcessImpl(out_loader, out_load_result, system, file, program_id, program_index); process) {
+ FileSys::NACP nacp;
+ if (out_loader->ReadControlData(nacp) == Loader::ResultStatus::Success) {
+ out_control = nacp.GetRawBytes();
+ } else {
+ out_control.resize(sizeof(FileSys::RawNACP));
+ std::fill(out_control.begin(), out_control.end(), (u8) 0);
+ }
- FileSys::PatchManager pm{launch.title_id, system.GetFileSystemController(), storage};
- launch.version = pm.GetGameVersion().value_or(0);
+ auto& storage = system.GetContentProviderUnion();
+ Service::Glue::ApplicationLaunchProperty launch{};
+ launch.title_id = process->GetProgramId();
- // TODO(DarkLordZach): When FSController/Game Card Support is added, if
- // current_process_game_card use correct StorageId
- launch.base_game_storage_id = GetStorageIdForFrontendSlot(
- storage.GetSlotForEntry(launch.title_id, FileSys::ContentRecordType::Program));
- launch.update_storage_id = GetStorageIdForFrontendSlot(storage.GetSlotForEntry(
- FileSys::GetUpdateTitleID(launch.title_id), FileSys::ContentRecordType::Program));
+ FileSys::PatchManager pm{launch.title_id, system.GetFileSystemController(), storage};
+ launch.version = pm.GetGameVersion().value_or(0);
- system.GetARPManager().Register(launch.title_id, launch, out_control);
+ // TODO(DarkLordZach): When FSController/Game Card Support is added, if
+ // current_process_game_card use correct StorageId
+ launch.base_game_storage_id = GetStorageIdForFrontendSlot(storage.GetSlotForEntry(launch.title_id, FileSys::ContentRecordType::Program));
+ launch.update_storage_id = GetStorageIdForFrontendSlot(storage.GetSlotForEntry(FileSys::GetUpdateTitleID(launch.title_id), FileSys::ContentRecordType::Program));
- return process;
+ system.GetARPManager().Register(launch.title_id, launch, out_control);
+ return process;
+ }
+ return std::nullopt;
}
} // namespace Service::AM