readable_event.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include "common/assert.h"
  6. #include "common/logging/log.h"
  7. #include "core/hle/kernel/errors.h"
  8. #include "core/hle/kernel/k_scheduler.h"
  9. #include "core/hle/kernel/kernel.h"
  10. #include "core/hle/kernel/object.h"
  11. #include "core/hle/kernel/readable_event.h"
  12. #include "core/hle/kernel/thread.h"
  13. namespace Kernel {
  14. ReadableEvent::ReadableEvent(KernelCore& kernel) : SynchronizationObject{kernel} {}
  15. ReadableEvent::~ReadableEvent() = default;
  16. bool ReadableEvent::ShouldWait(const Thread* thread) const {
  17. return !is_signaled;
  18. }
  19. void ReadableEvent::Acquire(Thread* thread) {
  20. ASSERT_MSG(IsSignaled(), "object unavailable!");
  21. }
  22. void ReadableEvent::Signal() {
  23. if (is_signaled) {
  24. return;
  25. }
  26. is_signaled = true;
  27. SynchronizationObject::Signal();
  28. }
  29. void ReadableEvent::Clear() {
  30. is_signaled = false;
  31. }
  32. ResultCode ReadableEvent::Reset() {
  33. SchedulerLock lock(kernel);
  34. if (!is_signaled) {
  35. LOG_TRACE(Kernel, "Handle is not signaled! object_id={}, object_type={}, object_name={}",
  36. GetObjectId(), GetTypeName(), GetName());
  37. return ERR_INVALID_STATE;
  38. }
  39. Clear();
  40. return RESULT_SUCCESS;
  41. }
  42. } // namespace Kernel