k_event.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "core/hle/kernel/k_event.h"
  4. #include "core/hle/kernel/k_process.h"
  5. #include "core/hle/kernel/k_resource_limit.h"
  6. namespace Kernel {
  7. KEvent::KEvent(KernelCore& kernel)
  8. : KAutoObjectWithSlabHeapAndContainer{kernel}, m_readable_event{kernel} {}
  9. KEvent::~KEvent() = default;
  10. void KEvent::Initialize(KProcess* owner) {
  11. // Create our readable event.
  12. KAutoObject::Create(std::addressof(m_readable_event));
  13. // Initialize our readable event.
  14. m_readable_event.Initialize(this);
  15. // Set our owner process.
  16. // HACK: this should never be nullptr, but service threads don't have a
  17. // proper parent process yet.
  18. if (owner != nullptr) {
  19. m_owner = owner;
  20. m_owner->Open();
  21. }
  22. // Mark initialized.
  23. m_initialized = true;
  24. }
  25. void KEvent::Finalize() {
  26. KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList>::Finalize();
  27. }
  28. Result KEvent::Signal() {
  29. KScopedSchedulerLock sl{m_kernel};
  30. R_SUCCEED_IF(m_readable_event_destroyed);
  31. return m_readable_event.Signal();
  32. }
  33. Result KEvent::Clear() {
  34. KScopedSchedulerLock sl{m_kernel};
  35. R_SUCCEED_IF(m_readable_event_destroyed);
  36. return m_readable_event.Clear();
  37. }
  38. void KEvent::PostDestroy(uintptr_t arg) {
  39. // Release the event count resource the owner process holds.
  40. KProcess* owner = reinterpret_cast<KProcess*>(arg);
  41. if (owner != nullptr) {
  42. owner->GetResourceLimit()->Release(LimitableResource::EventCountMax, 1);
  43. owner->Close();
  44. }
  45. }
  46. } // namespace Kernel