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

97.6% Lines (41/42) 100.0% List of functions (40/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&) :52 591x 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&) :52 591x 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&) :52 427x 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&) :52 427x 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() :61 591x 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() :61 591x 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() :61 427x 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() :61 427x 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() :63 591x 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() :63 591x 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() :63 427x 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() :63 427x 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() :71 22x 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() :71 135x 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() :71 22x 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() :71 108x 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*) :83 22x 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*) :83 135x 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*) :83 22x 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*) :83 108x 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&) :92 37x 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&) :92 265x 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&) :92 37x 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&) :92 210x 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 :97 22x 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 :97 240x 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 :97 22x 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 :97 186x 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*) :102 1x 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>::post(boost::corosio::detail::scheduler_op*) :102 20x 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*) :102 1x 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>::post(boost::corosio::detail::scheduler_op*) :102 10x 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() :107 10x 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() :107 4832x 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() :107 10x 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() :107 3463x 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() :112 1x 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_finished() :112 16x 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() :112 1x 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_finished() :112 6x 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 protected:
51 // NOLINTNEXTLINE(bugprone-crtp-constructor-accessibility)
52 2036x explicit reactor_acceptor_service(capy::execution_context& ctx)
53 2036x : ctx_(ctx)
54 2036x , state_(
55 std::make_unique<state_type>(
56 2036x ctx.template use_service<Scheduler>()))
57 {
58 2036x }
59
60 public:
61 2036x ~reactor_acceptor_service() override = default;
62
63 2036x void shutdown() override
64 {
65 2036x std::lock_guard lock(state_->mutex_);
66
67 2036x while (auto* impl = state_->impl_list_.pop_front())
68 impl->close_socket();
69 2036x }
70
71 287x io_object::implementation* construct() override
72 {
73 287x auto impl = std::make_shared<Impl>(static_cast<Derived&>(*this));
74 287x auto* raw = impl.get();
75
76 287x std::lock_guard lock(state_->mutex_);
77 287x state_->impl_ptrs_.emplace(raw, std::move(impl));
78 287x state_->impl_list_.push_back(raw);
79
80 287x return raw;
81 287x }
82
83 287x void destroy(io_object::implementation* impl) override
84 {
85 287x auto* typed = static_cast<Impl*>(impl);
86 287x typed->close_socket();
87 287x std::lock_guard lock(state_->mutex_);
88 287x state_->impl_list_.remove(typed);
89 287x state_->impl_ptrs_.erase(typed);
90 287x }
91
92 549x void close(io_object::handle& h) override
93 {
94 549x static_cast<Impl*>(h.get())->close_socket();
95 549x }
96
97 470x Scheduler& scheduler() const noexcept
98 {
99 470x return state_->sched_;
100 }
101
102 32x void post(scheduler_op* op)
103 {
104 32x state_->sched_.post(op);
105 32x }
106
107 8315x void work_started() noexcept
108 {
109 8315x state_->sched_.work_started();
110 8315x }
111
112 24x void work_finished() noexcept
113 {
114 24x state_->sched_.work_finished();
115 24x }
116
117 8295x StreamService* stream_service() const noexcept
118 {
119 8295x return stream_svc_;
120 }
121
122 protected:
123 capy::execution_context& ctx_;
124 std::unique_ptr<state_type> state_;
125 StreamService* stream_svc_ = nullptr;
126
127 private:
128 reactor_acceptor_service(reactor_acceptor_service const&) = delete;
129 reactor_acceptor_service& operator=(reactor_acceptor_service const&) = delete;
130 };
131
132 } // namespace boost::corosio::detail
133
134 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_ACCEPTOR_SERVICE_HPP
135