3#include <boost/asio/awaitable.hpp>
4#include <boost/asio/cancellation_signal.hpp>
5#include <boost/asio/experimental/channel_error.hpp>
6#include <boost/asio/io_context.hpp>
7#include <boost/system/system_error.hpp>
9#include <spdlog/spdlog.h>
43 template<
typename... HandlerArgs>
45 const std::shared_ptr<in_queue_t> &in_queue,
47 HandlerArgs &&...handler_args)
48 : io_context_(io_context), in_queue_(in_queue),
49 handler_(std::make_shared<Handler>(std::forward<HandlerArgs>(handler_args)..., out_queues))
61 auto run_once(std::shared_ptr<boost::asio::cancellation_slot> cancel_slot =
nullptr) -> boost::asio::awaitable<void>
63 auto evt =
co_await in_queue_->pop(cancel_slot);
64 handler_->handle(evt);
78 auto run(std::shared_ptr<boost::asio::cancellation_slot> cancel_slot =
nullptr) -> boost::asio::awaitable<void>
81 while (
true) {
co_await run_once(cancel_slot); }
82 }
catch (
const boost::system::system_error &e) {
83 if (e.code() == boost::asio::error::operation_aborted
84 or e.code() == boost::asio::experimental::error::channel_cancelled
85 or e.code() == boost::asio::experimental::error::channel_closed) {
86 spdlog::debug(
"[standard_processor] Cancelled, exiting run loop");
89 spdlog::error(
"[standard_processor] Unexpected error in run loop: {}", e.what());
96 std::shared_ptr<boost::asio::io_context> io_context_;
97 std::shared_ptr<in_queue_t> in_queue_;
98 std::shared_ptr<Handler> handler_;
Generic queue-processing loop that HasA handler (no virtual inheritance).
typename Handler::out_queues_t out_queues_t
auto run(std::shared_ptr< boost::asio::cancellation_slot > cancel_slot=nullptr) -> boost::asio::awaitable< void >
Continuously processes events from the input queue until cancelled or closed.
auto run_once(std::shared_ptr< boost::asio::cancellation_slot > cancel_slot=nullptr) -> boost::asio::awaitable< void >
Processes a single event from the input queue.
typename Handler::in_queue_t in_queue_t
standard_processor(const std::shared_ptr< boost::asio::io_context > &io_context, const std::shared_ptr< in_queue_t > &in_queue, const out_queues_t &out_queues, HandlerArgs &&...handler_args)
Constructs a standard processor with handler-specific arguments.