kernel_helpers.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "core/core.h"
  4. #include "core/core_timing.h"
  5. #include "core/hle/kernel/k_event.h"
  6. #include "core/hle/kernel/k_memory_manager.h"
  7. #include "core/hle/kernel/k_process.h"
  8. #include "core/hle/kernel/k_readable_event.h"
  9. #include "core/hle/kernel/k_resource_limit.h"
  10. #include "core/hle/kernel/k_scoped_resource_reservation.h"
  11. #include "core/hle/service/kernel_helpers.h"
  12. namespace Service::KernelHelpers {
  13. ServiceContext::ServiceContext(Core::System& system_, std::string name_)
  14. : kernel(system_.Kernel()) {
  15. if (process = Kernel::GetCurrentProcessPointer(kernel); process != nullptr) {
  16. return;
  17. }
  18. // Create the process.
  19. process = Kernel::KProcess::Create(kernel);
  20. ASSERT(Kernel::KProcess::Initialize(process, system_, std::move(name_),
  21. Kernel::KProcess::ProcessType::KernelInternal,
  22. kernel.GetSystemResourceLimit())
  23. .IsSuccess());
  24. // Register the process.
  25. Kernel::KProcess::Register(kernel, process);
  26. process_created = true;
  27. }
  28. ServiceContext::~ServiceContext() {
  29. if (process_created) {
  30. process->Close();
  31. process = nullptr;
  32. }
  33. }
  34. Kernel::KEvent* ServiceContext::CreateEvent(std::string&& name) {
  35. // Reserve a new event from the process resource limit
  36. Kernel::KScopedResourceReservation event_reservation(process,
  37. Kernel::LimitableResource::EventCountMax);
  38. if (!event_reservation.Succeeded()) {
  39. LOG_CRITICAL(Service, "Resource limit reached!");
  40. return {};
  41. }
  42. // Create a new event.
  43. auto* event = Kernel::KEvent::Create(kernel);
  44. if (!event) {
  45. LOG_CRITICAL(Service, "Unable to create event!");
  46. return {};
  47. }
  48. // Initialize the event.
  49. event->Initialize(process);
  50. // Commit the thread reservation.
  51. event_reservation.Commit();
  52. // Register the event.
  53. Kernel::KEvent::Register(kernel, event);
  54. return event;
  55. }
  56. void ServiceContext::CloseEvent(Kernel::KEvent* event) {
  57. event->GetReadableEvent().Close();
  58. event->Close();
  59. }
  60. } // namespace Service::KernelHelpers