kernel_helpers.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2021 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/core.h"
  5. #include "core/hle/kernel/k_event.h"
  6. #include "core/hle/kernel/k_process.h"
  7. #include "core/hle/kernel/k_readable_event.h"
  8. #include "core/hle/kernel/k_resource_limit.h"
  9. #include "core/hle/kernel/k_scoped_resource_reservation.h"
  10. #include "core/hle/kernel/k_writable_event.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. process = Kernel::KProcess::Create(kernel);
  16. ASSERT(Kernel::KProcess::Initialize(process, system_, std::move(name_),
  17. Kernel::KProcess::ProcessType::Userland)
  18. .IsSuccess());
  19. }
  20. ServiceContext::~ServiceContext() {
  21. process->Close();
  22. process = nullptr;
  23. }
  24. Kernel::KEvent* ServiceContext::CreateEvent(std::string&& name) {
  25. // Reserve a new event from the process resource limit
  26. Kernel::KScopedResourceReservation event_reservation(process,
  27. Kernel::LimitableResource::Events);
  28. if (!event_reservation.Succeeded()) {
  29. LOG_CRITICAL(Service, "Resource limit reached!");
  30. return {};
  31. }
  32. // Create a new event.
  33. auto* event = Kernel::KEvent::Create(kernel);
  34. if (!event) {
  35. LOG_CRITICAL(Service, "Unable to create event!");
  36. return {};
  37. }
  38. // Initialize the event.
  39. event->Initialize(std::move(name));
  40. // Commit the thread reservation.
  41. event_reservation.Commit();
  42. // Register the event.
  43. Kernel::KEvent::Register(kernel, event);
  44. return event;
  45. }
  46. void ServiceContext::CloseEvent(Kernel::KEvent* event) {
  47. event->GetReadableEvent().Close();
  48. event->GetWritableEvent().Close();
  49. }
  50. } // namespace Service::KernelHelpers