include/boost/corosio/native/detail/reactor/reactor_acceptor_service.hpp

90.2% Lines (148/164) 90.0% List of functions (36/40)
reactor_acceptor_service.hpp
f(x) Functions (40)
Function Calls Lines Blocks
boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::reactor_acceptor_service(boost::capy::execution_context&) :50 356x 100.0% 83.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::reactor_acceptor_service(boost::capy::execution_context&) :50 356x 100.0% 83.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::reactor_acceptor_service(boost::capy::execution_context&) :50 229x 100.0% 83.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::reactor_acceptor_service(boost::capy::execution_context&) :50 229x 100.0% 83.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::~reactor_acceptor_service() :59 356x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::~reactor_acceptor_service() :59 356x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::~reactor_acceptor_service() :59 229x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::~reactor_acceptor_service() :59 229x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::shutdown() :61 356x 80.0% 82.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::shutdown() :61 356x 80.0% 82.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::shutdown() :61 229x 80.0% 82.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::shutdown() :61 229x 80.0% 82.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::construct() :69 6x 100.0% 78.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::construct() :69 84x 100.0% 78.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::construct() :69 6x 100.0% 78.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::construct() :69 65x 100.0% 78.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::destroy(boost::corosio::io_object::implementation*) :81 6x 100.0% 83.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::destroy(boost::corosio::io_object::implementation*) :81 84x 100.0% 83.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::destroy(boost::corosio::io_object::implementation*) :81 6x 100.0% 83.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::destroy(boost::corosio::io_object::implementation*) :81 65x 100.0% 83.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::close(boost::corosio::io_object::handle&) :90 12x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::close(boost::corosio::io_object::handle&) :90 166x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::close(boost::corosio::io_object::handle&) :90 12x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::close(boost::corosio::io_object::handle&) :90 127x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::scheduler() const :95 4x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::scheduler() const :95 155x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::scheduler() const :95 4x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::scheduler() const :95 119x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::post(boost::corosio::detail::scheduler_op*) :100 0 0.0% 0.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::post(boost::corosio::detail::scheduler_op*) :100 12x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::post(boost::corosio::detail::scheduler_op*) :100 0 0.0% 0.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::post(boost::corosio::detail::scheduler_op*) :100 6x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::work_started() :105 2x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::work_started() :105 4007x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::work_started() :105 2x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::work_started() :105 3223x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service>::work_finished() :110 0 0.0% 0.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service>::work_finished() :110 9x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::work_finished() :110 0 0.0% 0.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::work_finished() :110 3x 100.0% 100.0%
Line TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Michael Vandeberg
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/cppalliance/corosio
8 //
9
10 #ifndef BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_ACCEPTOR_SERVICE_HPP
11 #define BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_ACCEPTOR_SERVICE_HPP
12
13 #include <boost/corosio/io/io_object.hpp>
14 #include <boost/corosio/detail/scheduler_op.hpp>
15 #include <boost/corosio/native/detail/reactor/reactor_service_state.hpp>
16 #include <boost/capy/ex/execution_context.hpp>
17
18 #include <memory>
19 #include <mutex>
20
21 namespace boost::corosio::detail {
22
23 /* CRTP base for reactor-backed acceptor service implementations.
24
25 Provides the shared construct/destroy/shutdown/close/post/work
26 logic that is identical across all reactor backends and acceptor
27 types (TCP and local stream). Derived classes add only
28 protocol-specific open/bind/listen/stream_service.
29
30 @tparam Derived The concrete service type (CRTP).
31 @tparam ServiceBase The abstract service base
32 (tcp_acceptor_service or
33 local_stream_acceptor_service).
34 @tparam Scheduler The backend's scheduler type.
35 @tparam Impl The backend's acceptor impl type.
36 @tparam StreamService The concrete stream service type returned
37 by stream_service().
38 */
39 template<
40 class Derived,
41 class ServiceBase,
42 class Scheduler,
43 class Impl,
44 class StreamService>
45 class reactor_acceptor_service : public ServiceBase
46 {
47 friend Derived;
48 using state_type = reactor_service_state<Scheduler, Impl>;
49
50 1170x explicit reactor_acceptor_service(capy::execution_context& ctx)
51 1170x : ctx_(ctx)
52 1170x , state_(
53 std::make_unique<state_type>(
54 1170x ctx.template use_service<Scheduler>()))
55 {
56 1170x }
57
58 public:
59 1170x ~reactor_acceptor_service() override = default;
60
61 1170x void shutdown() override
62 {
63 1170x std::lock_guard lock(state_->mutex_);
64
65 1170x while (auto* impl = state_->impl_list_.pop_front())
66 impl->close_socket();
67 1170x }
68
69 161x io_object::implementation* construct() override
70 {
71 161x auto impl = std::make_shared<Impl>(static_cast<Derived&>(*this));
72 161x auto* raw = impl.get();
73
74 161x std::lock_guard lock(state_->mutex_);
75 161x state_->impl_ptrs_.emplace(raw, std::move(impl));
76 161x state_->impl_list_.push_back(raw);
77
78 161x return raw;
79 161x }
80
81 161x void destroy(io_object::implementation* impl) override
82 {
83 161x auto* typed = static_cast<Impl*>(impl);
84 161x typed->close_socket();
85 161x std::lock_guard lock(state_->mutex_);
86 161x state_->impl_list_.remove(typed);
87 161x state_->impl_ptrs_.erase(typed);
88 161x }
89
90 317x void close(io_object::handle& h) override
91 {
92 317x static_cast<Impl*>(h.get())->close_socket();
93 317x }
94
95 282x Scheduler& scheduler() const noexcept
96 {
97 282x return state_->sched_;
98 }
99
100 18x void post(scheduler_op* op)
101 {
102 18x state_->sched_.post(op);
103 18x }
104
105 7234x void work_started() noexcept
106 {
107 7234x state_->sched_.work_started();
108 7234x }
109
110 12x void work_finished() noexcept
111 {
112 12x state_->sched_.work_finished();
113 12x }
114
115 7228x StreamService* stream_service() const noexcept
116 {
117 7228x return stream_svc_;
118 }
119
120 protected:
121 capy::execution_context& ctx_;
122 std::unique_ptr<state_type> state_;
123 StreamService* stream_svc_ = nullptr;
124
125 private:
126 reactor_acceptor_service(reactor_acceptor_service const&) = delete;
127 reactor_acceptor_service& operator=(reactor_acceptor_service const&) = delete;
128 };
129
130 } // namespace boost::corosio::detail
131
132 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_ACCEPTOR_SERVICE_HPP
133