From 1e24adf247da28fd11096875613dfcf771ff9e3d Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 5 Dec 2024 11:08:37 +0100 Subject: [PATCH] Introduce AsioConditionVariable --- lib/base/io-engine.cpp | 24 ++++++++++++++++++++++++ lib/base/io-engine.hpp | 18 ++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/lib/base/io-engine.cpp b/lib/base/io-engine.cpp index aa20a1052..94397204e 100644 --- a/lib/base/io-engine.cpp +++ b/lib/base/io-engine.cpp @@ -143,6 +143,30 @@ void AsioDualEvent::WaitForClear(boost::asio::yield_context yc) m_IsFalse.Wait(std::move(yc)); } +AsioConditionVariable::AsioConditionVariable(boost::asio::io_context& io) + : m_Timer(io) +{ + m_Timer.expires_at(boost::posix_time::pos_infin); +} + +void AsioConditionVariable::Wait(boost::asio::yield_context yc) +{ + boost::system::error_code ec; + m_Timer.async_wait(yc[ec]); +} + +bool AsioConditionVariable::NotifyOne() +{ + boost::system::error_code ec; + return m_Timer.cancel_one(ec); +} + +size_t AsioConditionVariable::NotifyAll() +{ + boost::system::error_code ec; + return m_Timer.cancel(ec); +} + /** * Cancels any pending timeout callback. * diff --git a/lib/base/io-engine.hpp b/lib/base/io-engine.hpp index c215b0a30..c51aa7d2b 100644 --- a/lib/base/io-engine.hpp +++ b/lib/base/io-engine.hpp @@ -55,6 +55,24 @@ private: bool m_Done; }; +/** + * Condition variable which doesn't block I/O threads + * + * @ingroup base + */ +class AsioConditionVariable +{ +public: + AsioConditionVariable(boost::asio::io_context& io); + + void Wait(boost::asio::yield_context yc); + bool NotifyOne(); + size_t NotifyAll(); + +private: + boost::asio::deadline_timer m_Timer; +}; + /** * Async I/O engine *