diff options
| author | Léo Lam <leo@leolam.fr> | 2020-09-10 12:35:27 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2020-09-10 13:53:26 +0200 |
| commit | 6af5dfd74748f13d8c375c49d0c3383fd4050c35 (patch) | |
| tree | dba14bf267c10d4d4ae6c4a3786bb7033bfa7783 /src/KingSystem/Utils/Thread/Event.cpp | |
| parent | 3ef37243538d9d8bb12cf5c64d91ac9525e6f4c2 (diff) | |
ksys/Utils: Add Event
Diffstat (limited to 'src/KingSystem/Utils/Thread/Event.cpp')
| -rw-r--r-- | src/KingSystem/Utils/Thread/Event.cpp | 50 |
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 |
