4#include <boost/asio/awaitable.hpp>
5#include <boost/asio/cancellation_signal.hpp>
6#include <boost/asio/experimental/channel_error.hpp>
7#include <boost/asio/io_context.hpp>
11#include <spdlog/spdlog.h>
31 const std::shared_ptr<connection_monitor> &monitor)
32 : io_context_(io_context), in_queue_(in_queue), monitor_(monitor)
42 auto run_once(std::shared_ptr<boost::asio::cancellation_slot> cancel_slot =
nullptr) -> boost::asio::awaitable<void>
44 auto evt =
co_await in_queue_->pop(cancel_slot);
45 std::visit([&](
auto &&event) { monitor_->handle(std::forward<
decltype(event)>(event)); }, evt);
56 auto run(std::shared_ptr<boost::asio::cancellation_slot> cancel_slot =
nullptr) -> boost::asio::awaitable<void>
59 while (
true) {
co_await run_once(cancel_slot); }
60 }
catch (
const boost::system::system_error &e) {
61 if (e.code() == boost::asio::error::operation_aborted
62 or e.code() == boost::asio::experimental::error::channel_cancelled
63 or e.code() == boost::asio::experimental::error::channel_closed) {
64 spdlog::debug(
"[connection_monitor_processor] Cancelled, exiting run loop");
67 spdlog::error(
"[connection_monitor_processor] Unexpected error in run loop: {}", e.what());
74 std::shared_ptr<boost::asio::io_context> io_context_;
75 std::shared_ptr<async::async_queue<events::connection_monitor::in_t>> in_queue_;
76 std::shared_ptr<connection_monitor> monitor_;
Thread-safe asynchronous queue for message passing between coroutines.
Processes connection monitor events (transport status and queries).
auto run(std::shared_ptr< boost::asio::cancellation_slot > cancel_slot=nullptr) -> boost::asio::awaitable< void >
Continuously processes events until cancelled.
connection_monitor_processor(const std::shared_ptr< boost::asio::io_context > &io_context, const std::shared_ptr< async::async_queue< events::connection_monitor::in_t > > &in_queue, const std::shared_ptr< connection_monitor > &monitor)
Constructs a connection monitor processor.
auto run_once(std::shared_ptr< boost::asio::cancellation_slot > cancel_slot=nullptr) -> boost::asio::awaitable< void >
Processes a single event from the queue.