summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/k_readable_event.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-01-31 10:38:57 +0100
committerbunnei <bunneidev@gmail.com>2021-02-05 23:03:32 +0100
commitff3c7c068b926399513bf7328c22e224ab0b53d6 (patch)
treec2a5d9f80ecf551659daa410cc384b1792eff31d /src/core/hle/kernel/k_readable_event.cpp
parenthle: kernel: Implement KEvent. (diff)
downloadyuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.tar
yuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.tar.gz
yuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.tar.bz2
yuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.tar.lz
yuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.tar.xz
yuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.tar.zst
yuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.zip
Diffstat (limited to 'src/core/hle/kernel/k_readable_event.cpp')
-rw-r--r--src/core/hle/kernel/k_readable_event.cpp44
1 files changed, 24 insertions, 20 deletions
diff --git a/src/core/hle/kernel/k_readable_event.cpp b/src/core/hle/kernel/k_readable_event.cpp
index e9e191bc6..0fa895c56 100644
--- a/src/core/hle/kernel/k_readable_event.cpp
+++ b/src/core/hle/kernel/k_readable_event.cpp
@@ -1,9 +1,10 @@
-// Copyright 2014 Citra Emulator Project
+// Copyright 2021 yuzu emulator team
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include <algorithm>
#include "common/assert.h"
+#include "common/common_funcs.h"
#include "common/logging/log.h"
#include "core/hle/kernel/errors.h"
#include "core/hle/kernel/k_readable_event.h"
@@ -11,40 +12,43 @@
#include "core/hle/kernel/k_thread.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/object.h"
+#include "core/hle/kernel/svc_results.h"
namespace Kernel {
-KReadableEvent::KReadableEvent(KernelCore& kernel) : KSynchronizationObject{kernel} {}
+KReadableEvent::KReadableEvent(KernelCore& kernel, std::string&& name)
+ : KSynchronizationObject{kernel, std::move(name)} {}
KReadableEvent::~KReadableEvent() = default;
-void KReadableEvent::Signal() {
- if (is_signaled) {
- return;
- }
-
- is_signaled = true;
- NotifyAvailable();
-}
-
bool KReadableEvent::IsSignaled() const {
ASSERT(kernel.GlobalSchedulerContext().IsLocked());
return is_signaled;
}
-void KReadableEvent::Clear() {
- is_signaled = false;
-}
+ResultCode KReadableEvent::Signal() {
+ KScopedSchedulerLock lk{kernel};
-ResultCode KReadableEvent::Reset() {
- KScopedSchedulerLock lock(kernel);
if (!is_signaled) {
- LOG_TRACE(Kernel, "Handle is not signaled! object_id={}, object_type={}, object_name={}",
- GetObjectId(), GetTypeName(), GetName());
- return ERR_INVALID_STATE;
+ is_signaled = true;
+ NotifyAvailable();
}
- Clear();
+ return RESULT_SUCCESS;
+}
+
+ResultCode KReadableEvent::Clear() {
+ Reset();
+
+ return RESULT_SUCCESS;
+}
+
+ResultCode KReadableEvent::Reset() {
+ KScopedSchedulerLock lk{kernel};
+
+ R_UNLESS_NOLOG(is_signaled, Svc::ResultInvalidState);
+
+ is_signaled = false;
return RESULT_SUCCESS;
}