summaryrefslogtreecommitdiff
path: root/src/KingSystem/Utils/Thread/Event.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-09-10 12:35:27 +0200
committerLéo Lam <leo@leolam.fr>2020-09-10 13:53:26 +0200
commit6af5dfd74748f13d8c375c49d0c3383fd4050c35 (patch)
treedba14bf267c10d4d4ae6c4a3786bb7033bfa7783 /src/KingSystem/Utils/Thread/Event.cpp
parent3ef37243538d9d8bb12cf5c64d91ac9525e6f4c2 (diff)
ksys/Utils: Add Event
Diffstat (limited to 'src/KingSystem/Utils/Thread/Event.cpp')
-rw-r--r--src/KingSystem/Utils/Thread/Event.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/KingSystem/Utils/Thread/Event.cpp b/src/KingSystem/Utils/Thread/Event.cpp
new file mode 100644
index 00000000..8476dd90
--- /dev/null
+++ b/src/KingSystem/Utils/Thread/Event.cpp
@@ -0,0 +1,50 @@
+#include "KingSystem/Utils/Thread/Event.h"
+
+namespace ksys::util {
+
+Event::Event() = default;
+
+Event::Event(sead::Heap* disposer_heap) : mEvent(disposer_heap) {}
+
+Event::Event(bool manual_reset) : mManualReset(manual_reset), mEvent(manual_reset) {}
+
+Event::Event(sead::Heap* disposer_heap, bool manual_reset)
+ : mManualReset(manual_reset), mEvent(disposer_heap, manual_reset) {}
+
+Event::Event(sead::Heap* disposer_heap, sead::IDisposer::HeapNullOption heap_null_option,
+ bool manual_reset)
+ : mManualReset(manual_reset), mEvent(disposer_heap, heap_null_option, manual_reset) {}
+
+Event::~Event() = default;
+
+void Event::initialize(bool manual_reset) {
+ mManualReset = manual_reset;
+ mEvent.initialize(manual_reset);
+}
+
+void Event::wait() {
+ if (!mSignalSet || !mManualReset)
+ mEvent.wait();
+}
+
+bool Event::wait(sead::TickSpan duration) {
+ return (mSignalSet && mManualReset) || mEvent.wait(duration);
+}
+
+void Event::setSignal() {
+ if (mSignalSet == 1 && mManualReset)
+ return;
+
+ mSignalSet.exchange(1);
+ mEvent.setSignal();
+}
+
+void Event::resetSignal() {
+ if (!mSignalSet && mManualReset)
+ return;
+
+ mEvent.resetSignal();
+ mSignalSet.exchange(0);
+}
+
+} // namespace ksys::util