diff options
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 |
