From 46cd2417e3fb0e4a646817543bc969e15f335c26 Mon Sep 17 00:00:00 2001 From: Henrik Stickann <4376396-Mithradir@users.noreply.gitlab.com> Date: Sun, 10 Apr 2022 15:24:22 +0200 Subject: [PATCH] Add atomic signal implementation --- include/sta/atomic_signal.hpp | 27 +++++++++++++++++++++++++++ src/atomic_signal.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 include/sta/atomic_signal.hpp create mode 100644 src/atomic_signal.cpp 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