From 060d8b185e318bbe9544132b8111c6e559a9cd7a Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 14 May 2025 12:24:28 +0200 Subject: [PATCH] Introduce AsioDualEvent --- lib/base/io-engine.cpp | 27 +++++++++++++++++++++++++++ lib/base/io-engine.hpp | 20 ++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/lib/base/io-engine.cpp b/lib/base/io-engine.cpp index 30e2512d4..0792be5cc 100644 --- a/lib/base/io-engine.cpp +++ b/lib/base/io-engine.cpp @@ -146,6 +146,33 @@ void AsioEvent::Wait(boost::asio::yield_context yc) m_Timer.async_wait(yc[ec]); } +AsioDualEvent::AsioDualEvent(boost::asio::io_context& io, bool init) + : m_IsTrue(io, init), m_IsFalse(io, !init) +{ +} + +void AsioDualEvent::Set() +{ + m_IsTrue.Set(); + m_IsFalse.Clear(); +} + +void AsioDualEvent::Clear() +{ + m_IsTrue.Clear(); + m_IsFalse.Set(); +} + +void AsioDualEvent::WaitForSet(boost::asio::yield_context yc) +{ + m_IsTrue.Wait(std::move(yc)); +} + +void AsioDualEvent::WaitForClear(boost::asio::yield_context yc) +{ + m_IsFalse.Wait(std::move(yc)); +} + /** * Cancels any pending timeout callback. * diff --git a/lib/base/io-engine.hpp b/lib/base/io-engine.hpp index 049523e52..0883d7810 100644 --- a/lib/base/io-engine.hpp +++ b/lib/base/io-engine.hpp @@ -175,6 +175,26 @@ private: boost::asio::deadline_timer m_Timer; }; +/** + * Like AsioEvent, which only allows waiting for an event to be set, but additionally supports waiting for clearing + * + * @ingroup base + */ +class AsioDualEvent +{ +public: + AsioDualEvent(boost::asio::io_context& io, bool init = false); + + void Set(); + void Clear(); + + void WaitForSet(boost::asio::yield_context yc); + void WaitForClear(boost::asio::yield_context yc); + +private: + AsioEvent m_IsTrue, m_IsFalse; +}; + /** * I/O timeout emulator *