yuzu/src/core/hle/service/kernel_helpers.cpp

65 lines
2.0 KiB
C++
Raw Normal View History

2022-04-23 22:49:07 +04:00
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2021-07-03 13:00:06 +04:00
#include "core/core.h"
2022-02-22 03:50:44 +04:00
#include "core/core_timing.h"
2021-07-03 13:00:06 +04:00
#include "core/hle/kernel/k_event.h"
2022-02-22 03:50:44 +04:00
#include "core/hle/kernel/k_memory_manager.h"
2021-07-03 13:00:06 +04:00
#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()) {
2022-02-22 03:50:44 +04:00
// Create the process.
2021-07-03 13:00:06 +04:00
process = Kernel::KProcess::Create(kernel);
ASSERT(Kernel::KProcess::Initialize(process, system_, std::move(name_),
2022-02-22 03:50:44 +04:00
Kernel::KProcess::ProcessType::KernelInternal,
2022-03-12 14:35:05 +04:00
kernel.GetSystemResourceLimit())
2021-07-03 13:00:06 +04:00
.IsSuccess());
}
ServiceContext::~ServiceContext() {
process->Close();
process = nullptr;
}
Kernel::KEvent* ServiceContext::CreateEvent(std::string&& name) {
// Reserve a new event from the process resource limit
Kernel::KScopedResourceReservation event_reservation(process,
Kernel::LimitableResource::Events);
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.
2022-10-14 11:35:00 +04:00
event->Initialize(process);
2021-07-03 13:00:06 +04:00
// Commit the thread reservation.
event_reservation.Commit();
// Register the event.
Kernel::KEvent::Register(kernel, event);
return event;
}
void ServiceContext::CloseEvent(Kernel::KEvent* event) {
event->GetReadableEvent().Close();
2022-10-14 11:35:00 +04:00
event->Close();
2021-07-03 13:00:06 +04:00
}
} // namespace Service::KernelHelpers