k_event.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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/hle/kernel/k_event.h"
  5. #include "core/hle/kernel/k_process.h"
  6. #include "core/hle/kernel/k_resource_limit.h"
  7. namespace Kernel {
  8. KEvent::KEvent(KernelCore& kernel_)
  9. : KAutoObjectWithSlabHeapAndContainer{kernel_}, readable_event{kernel_}, writable_event{
  10. kernel_} {}
  11. KEvent::~KEvent() = default;
  12. void KEvent::Initialize(std::string&& name_, KProcess* owner_) {
  13. // Increment reference count.
  14. // Because reference count is one on creation, this will result
  15. // in a reference count of two. Thus, when both readable and
  16. // writable events are closed this object will be destroyed.
  17. Open();
  18. // Create our sub events.
  19. KAutoObject::Create(std::addressof(readable_event));
  20. KAutoObject::Create(std::addressof(writable_event));
  21. // Initialize our sub sessions.
  22. readable_event.Initialize(this, name_ + ":Readable");
  23. writable_event.Initialize(this, name_ + ":Writable");
  24. // Set our owner process.
  25. owner = owner_;
  26. owner->Open();
  27. // Mark initialized.
  28. name = std::move(name_);
  29. initialized = true;
  30. }
  31. void KEvent::Finalize() {
  32. KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList>::Finalize();
  33. }
  34. void KEvent::PostDestroy(uintptr_t arg) {
  35. // Release the event count resource the owner process holds.
  36. KProcess* owner = reinterpret_cast<KProcess*>(arg);
  37. owner->GetResourceLimit()->Release(LimitableResource::Events, 1);
  38. owner->Close();
  39. }
  40. } // namespace Kernel