summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Lioncash2018-12-04 18:54:18 -0500
committerGravatar Lioncash2018-12-04 20:14:55 -0500
commita3aa7aaf0be9d95766b9c123b7c32b6505084c3c (patch)
tree1781f48332b8b58303baeac93654bc247b87bf94
parentMerge pull request #1838 from lioncash/dedup (diff)
downloadyuzu-a3aa7aaf0be9d95766b9c123b7c32b6505084c3c.tar.gz
yuzu-a3aa7aaf0be9d95766b9c123b7c32b6505084c3c.tar.xz
yuzu-a3aa7aaf0be9d95766b9c123b7c32b6505084c3c.zip
kernel/readable_event: Add member function for enforcing a strict reset contract
svcResetSignal relies on the event instance to have already been signaled before attempting to reset it. If this isn't the case, then an error code has to be returned.
-rw-r--r--src/core/hle/kernel/readable_event.cpp12
-rw-r--r--src/core/hle/kernel/readable_event.h11
2 files changed, 22 insertions, 1 deletions
diff --git a/src/core/hle/kernel/readable_event.cpp b/src/core/hle/kernel/readable_event.cpp
index 92e16b4e6..ba01f495c 100644
--- a/src/core/hle/kernel/readable_event.cpp
+++ b/src/core/hle/kernel/readable_event.cpp
@@ -4,10 +4,10 @@
4 4
5#include <algorithm> 5#include <algorithm>
6#include "common/assert.h" 6#include "common/assert.h"
7#include "core/hle/kernel/errors.h"
7#include "core/hle/kernel/object.h" 8#include "core/hle/kernel/object.h"
8#include "core/hle/kernel/readable_event.h" 9#include "core/hle/kernel/readable_event.h"
9#include "core/hle/kernel/thread.h" 10#include "core/hle/kernel/thread.h"
10#include "core/hle/kernel/writable_event.h"
11 11
12namespace Kernel { 12namespace Kernel {
13 13
@@ -34,6 +34,16 @@ void ReadableEvent::Clear() {
34 signaled = false; 34 signaled = false;
35} 35}
36 36
37ResultCode ReadableEvent::Reset() {
38 if (!signaled) {
39 return ERR_INVALID_STATE;
40 }
41
42 Clear();
43
44 return RESULT_SUCCESS;
45}
46
37void ReadableEvent::WakeupAllWaitingThreads() { 47void ReadableEvent::WakeupAllWaitingThreads() {
38 WaitObject::WakeupAllWaitingThreads(); 48 WaitObject::WakeupAllWaitingThreads();
39 49
diff --git a/src/core/hle/kernel/readable_event.h b/src/core/hle/kernel/readable_event.h
index 867ff3051..80b3b0aba 100644
--- a/src/core/hle/kernel/readable_event.h
+++ b/src/core/hle/kernel/readable_event.h
@@ -7,6 +7,8 @@
7#include "core/hle/kernel/object.h" 7#include "core/hle/kernel/object.h"
8#include "core/hle/kernel/wait_object.h" 8#include "core/hle/kernel/wait_object.h"
9 9
10union ResultCode;
11
10namespace Kernel { 12namespace Kernel {
11 13
12class KernelCore; 14class KernelCore;
@@ -39,8 +41,17 @@ public:
39 41
40 void WakeupAllWaitingThreads() override; 42 void WakeupAllWaitingThreads() override;
41 43
44 /// Unconditionally clears the readable event's state.
42 void Clear(); 45 void Clear();
43 46
47 /// Clears the readable event's state if and only if it
48 /// has already been signaled.
49 ///
50 /// @pre The event must be in a signaled state. If this event
51 /// is in an unsignaled state and this function is called,
52 /// then ERR_INVALID_STATE will be returned.
53 ResultCode Reset();
54
44private: 55private:
45 explicit ReadableEvent(KernelCore& kernel); 56 explicit ReadableEvent(KernelCore& kernel);
46 57