mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-16 21:33:01 +00:00
3aa0d46259
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>
78 lines
2.3 KiB
C++
78 lines
2.3 KiB
C++
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "core/core.h"
|
|
#include "core/core_timing.h"
|
|
#include "core/hle/kernel/k_event.h"
|
|
#include "core/hle/kernel/k_memory_manager.h"
|
|
#include "core/hle/kernel/k_process.h"
|
|
#include "core/hle/kernel/k_readable_event.h"
|
|
#include "core/hle/kernel/k_resource_limit.h"
|
|
#include "core/hle/kernel/k_scoped_resource_reservation.h"
|
|
#include "core/hle/service/kernel_helpers.h"
|
|
|
|
namespace Service::KernelHelpers {
|
|
|
|
ServiceContext::ServiceContext(Core::System& system_, std::string name_)
|
|
: kernel(system_.Kernel())
|
|
{
|
|
if (process = Kernel::GetCurrentProcessPointer(kernel); process != nullptr) {
|
|
return;
|
|
}
|
|
|
|
// Create the process.
|
|
process = Kernel::KProcess::Create(kernel);
|
|
ASSERT(R_SUCCEEDED(process->Initialize(kernel, Kernel::Svc::CreateProcessParameter{}, kernel.GetSystemResourceLimit(), false)));
|
|
|
|
// Register the process.
|
|
Kernel::KProcess::Register(kernel, process);
|
|
process_created = true;
|
|
}
|
|
|
|
ServiceContext::~ServiceContext() {
|
|
if (process_created) {
|
|
process->Close(kernel);
|
|
process = nullptr;
|
|
}
|
|
}
|
|
|
|
Kernel::KEvent* ServiceContext::CreateEvent(std::string&& name) {
|
|
// Reserve a new event from the process resource limit
|
|
Kernel::KScopedResourceReservation event_reservation(kernel, process,
|
|
Kernel::LimitableResource::EventCountMax);
|
|
if (!event_reservation.Succeeded()) {
|
|
LOG_CRITICAL(Service, "Resource limit reached!");
|
|
return {};
|
|
}
|
|
|
|
// Create a new event.
|
|
auto* event = Kernel::KEvent::Create(kernel);
|
|
if (!event) {
|
|
LOG_CRITICAL(Service, "Unable to create event!");
|
|
return {};
|
|
}
|
|
|
|
// Initialize the event.
|
|
event->Initialize(kernel, process);
|
|
|
|
// Commit the thread reservation.
|
|
event_reservation.Commit();
|
|
|
|
// Register the event.
|
|
Kernel::KEvent::Register(kernel, event);
|
|
|
|
return event;
|
|
}
|
|
|
|
void ServiceContext::CloseEvent(Kernel::KEvent* event) {
|
|
if (event) {
|
|
event->GetReadableEvent().Close(kernel);
|
|
event->Close(kernel);
|
|
}
|
|
}
|
|
|
|
} // namespace Service::KernelHelpers
|