diff --git a/include/sta/atomic_signal.hpp b/include/sta/atomic_signal.hpp new file mode 100644 index 0000000..88dde48 --- /dev/null +++ b/include/sta/atomic_signal.hpp @@ -0,0 +1,27 @@ +#ifndef STA_ATOMIC_SIGNAL_HPP +#define STA_ATOMIC_SIGNAL_HPP + +#include + +#include + + +namespace sta +{ + class AtomicSignal : public Signal + { + public: + AtomicSignal(); + + void notify() override; + bool peek() override; + bool test() override; + void wait() override; + + private: + std::atomic signal_; + }; +} // namespace sta + + +#endif // STA_ATOMIC_SIGNAL_HPP diff --git a/src/atomic_signal.cpp b/src/atomic_signal.cpp new file mode 100644 index 0000000..280aa30 --- /dev/null +++ b/src/atomic_signal.cpp @@ -0,0 +1,29 @@ +#include + + +namespace sta +{ + AtomicSignal::AtomicSignal() + : signal_{false} + {} + + void AtomicSignal::notify() + { + signal_.store(true); + } + + bool AtomicSignal::peek() + { + return signal_.load(); + } + + bool AtomicSignal::test() + { + return signal_.exchange(false); + } + + void AtomicSignal::wait() + { + while (!signal_.exchange(false)); + } +} // namespace sta