LCOV - code coverage report
Current view: top level - corosio/native/detail/reactor - reactor_socket_finals.hpp (source / functions) Coverage Total Hit Missed
Test: coverage_remapped.info Lines: 66.7 % 24 16 8
Test Date: 2026-04-09 23:21:11 Functions: 56.0 % 50 28 22

           TLA  Line data    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_SOCKET_FINALS_HPP
      11                 : #define BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SOCKET_FINALS_HPP
      12                 : 
      13                 : /* Parameterized final socket and acceptor types for reactor backends.
      14                 : 
      15                 :    These templates are instantiated per-backend via Traits to produce
      16                 :    the concrete socket types used by the public API. Each final type
      17                 :    is a thin wrapper adding only protocol-specific details (ImplBase,
      18                 :    Endpoint) to the CRTP base classes.
      19                 : */
      20                 : 
      21                 : #include <boost/corosio/tcp_socket.hpp>
      22                 : #include <boost/corosio/udp_socket.hpp>
      23                 : #include <boost/corosio/local_stream_socket.hpp>
      24                 : #include <boost/corosio/local_datagram_socket.hpp>
      25                 : #include <boost/corosio/tcp_acceptor.hpp>
      26                 : #include <boost/corosio/local_stream_acceptor.hpp>
      27                 : #include <boost/corosio/shutdown_type.hpp>
      28                 : 
      29                 : #include <boost/corosio/native/detail/reactor/reactor_stream_socket.hpp>
      30                 : #include <boost/corosio/native/detail/reactor/reactor_datagram_socket.hpp>
      31                 : #include <boost/corosio/native/detail/reactor/reactor_acceptor.hpp>
      32                 : #include <boost/corosio/native/detail/reactor/reactor_stream_ops.hpp>
      33                 : #include <boost/corosio/native/detail/reactor/reactor_datagram_ops.hpp>
      34                 : 
      35                 : #include <boost/corosio/detail/tcp_acceptor_service.hpp>
      36                 : #include <boost/corosio/detail/local_stream_acceptor_service.hpp>
      37                 : #include <boost/corosio/native/detail/make_err.hpp>
      38                 : 
      39                 : namespace boost::corosio::detail {
      40                 : 
      41                 : // ============================================================
      42                 : // Forward declarations
      43                 : // ============================================================
      44                 : 
      45                 : template<class Traits, class ImplBase, class Endpoint> class reactor_stream_socket_final;
      46                 : template<class Traits, class ImplBase, class Endpoint> class reactor_dgram_socket_final;
      47                 : template<class Traits, class AccImplBase, class Endpoint> class reactor_acceptor_final;
      48                 : 
      49                 : template<class Traits, class SocketFinal> class reactor_tcp_service_final;
      50                 : template<class Traits, class SocketFinal> class reactor_local_stream_service_final;
      51                 : template<class Traits, class SocketFinal> class reactor_udp_service_final;
      52                 : template<class Traits, class SocketFinal> class reactor_local_dgram_service_final;
      53                 : template<class Traits, class ServiceBase, class AccFinal, class StreamServiceFinal, class Endpoint> class reactor_acceptor_service_final;
      54                 : 
      55                 : // ============================================================
      56                 : // Op type aliases
      57                 : // ============================================================
      58                 : 
      59                 : template<class Traits, class Endpoint>
      60                 : using stream_socket_t = reactor_stream_socket_final<Traits,
      61                 :     std::conditional_t<std::is_same_v<Endpoint, endpoint>,
      62                 :         tcp_socket::implementation,
      63                 :         local_stream_socket::implementation>,
      64                 :     Endpoint>;
      65                 : 
      66                 : template<class Traits, class Endpoint>
      67                 : using stream_acceptor_t = reactor_acceptor_final<Traits,
      68                 :     std::conditional_t<std::is_same_v<Endpoint, endpoint>,
      69                 :         tcp_acceptor::implementation,
      70                 :         local_stream_acceptor::implementation>,
      71                 :     Endpoint>;
      72                 : 
      73                 : template<class Traits, class Endpoint>
      74                 : using stream_base_op = reactor_stream_base_op<
      75                 :     Traits, stream_socket_t<Traits, Endpoint>,
      76                 :     stream_acceptor_t<Traits, Endpoint>, Endpoint>;
      77                 : 
      78                 : template<class Traits, class Endpoint>
      79                 : using stream_connect_op = reactor_stream_connect_op<
      80                 :     Traits, stream_socket_t<Traits, Endpoint>,
      81                 :     stream_acceptor_t<Traits, Endpoint>, Endpoint>;
      82                 : 
      83                 : template<class Traits, class Endpoint>
      84                 : using stream_read_op = reactor_stream_read_op<
      85                 :     Traits, stream_socket_t<Traits, Endpoint>,
      86                 :     stream_acceptor_t<Traits, Endpoint>, Endpoint>;
      87                 : 
      88                 : template<class Traits, class Endpoint>
      89                 : using stream_write_op = reactor_stream_write_op<
      90                 :     Traits, stream_socket_t<Traits, Endpoint>,
      91                 :     stream_acceptor_t<Traits, Endpoint>, Endpoint>;
      92                 : 
      93                 : template<class Traits, class Endpoint>
      94                 : using stream_accept_op = reactor_stream_accept_op<
      95                 :     Traits, stream_socket_t<Traits, Endpoint>,
      96                 :     stream_acceptor_t<Traits, Endpoint>, Endpoint>;
      97                 : 
      98                 : template<class Traits, class Endpoint>
      99                 : using dgram_socket_t = reactor_dgram_socket_final<Traits,
     100                 :     std::conditional_t<std::is_same_v<Endpoint, endpoint>,
     101                 :         udp_socket::implementation,
     102                 :         local_datagram_socket::implementation>,
     103                 :     Endpoint>;
     104                 : 
     105                 : template<class Traits, class Endpoint>
     106                 : using dgram_connect_op = reactor_dgram_connect_op<
     107                 :     Traits, dgram_socket_t<Traits, Endpoint>,
     108                 :     stream_acceptor_t<Traits, endpoint>, Endpoint>;
     109                 : 
     110                 : template<class Traits, class Endpoint>
     111                 : using dgram_send_to_op = reactor_dgram_send_to_op<
     112                 :     Traits, dgram_socket_t<Traits, Endpoint>,
     113                 :     stream_acceptor_t<Traits, endpoint>, Endpoint>;
     114                 : 
     115                 : template<class Traits, class Endpoint>
     116                 : using dgram_recv_from_op = reactor_dgram_recv_from_op<
     117                 :     Traits, dgram_socket_t<Traits, Endpoint>,
     118                 :     stream_acceptor_t<Traits, endpoint>, Endpoint>;
     119                 : 
     120                 : template<class Traits, class Endpoint>
     121                 : using dgram_send_op = reactor_dgram_send_op<
     122                 :     Traits, dgram_socket_t<Traits, Endpoint>,
     123                 :     stream_acceptor_t<Traits, endpoint>, Endpoint>;
     124                 : 
     125                 : template<class Traits, class Endpoint>
     126                 : using dgram_recv_op = reactor_dgram_recv_op<
     127                 :     Traits, dgram_socket_t<Traits, Endpoint>,
     128                 :     stream_acceptor_t<Traits, endpoint>, Endpoint>;
     129                 : 
     130                 : // ============================================================
     131                 : // Stream socket final
     132                 : // ============================================================
     133                 : 
     134                 : template<class Traits, class ImplBase, class Endpoint>
     135                 : class reactor_stream_socket_final final
     136                 :     : public reactor_stream_socket<
     137                 :           reactor_stream_socket_final<Traits, ImplBase, Endpoint>,
     138                 :           std::conditional_t<std::is_same_v<Endpoint, endpoint>,
     139                 :               reactor_tcp_service_final<
     140                 :                   Traits, reactor_stream_socket_final<Traits, ImplBase, Endpoint>>,
     141                 :               reactor_local_stream_service_final<
     142                 :                   Traits, reactor_stream_socket_final<Traits, ImplBase, Endpoint>>>,
     143                 :           stream_connect_op<Traits, Endpoint>,
     144                 :           stream_read_op<Traits, Endpoint>,
     145                 :           stream_write_op<Traits, Endpoint>,
     146                 :           typename Traits::desc_state_type,
     147                 :           ImplBase,
     148                 :           Endpoint>
     149                 : {
     150                 :     using service_type = std::conditional_t<std::is_same_v<Endpoint, endpoint>,
     151                 :         reactor_tcp_service_final<Traits, reactor_stream_socket_final>,
     152                 :         reactor_local_stream_service_final<Traits, reactor_stream_socket_final>>;
     153                 :     friend service_type;
     154                 : 
     155                 : public:
     156                 :     using impl_base_type = ImplBase;
     157                 : 
     158                 :     /// Per-socket hook state (e.g., kqueue SO_LINGER tracking).
     159                 :     [[no_unique_address]] typename Traits::stream_socket_hook hook_;
     160                 : 
     161 HIT       25677 :     explicit reactor_stream_socket_final(service_type& svc) noexcept
     162           25677 :         : reactor_stream_socket_final::reactor_stream_socket(svc)
     163                 :     {
     164           25677 :     }
     165                 : 
     166           25677 :     ~reactor_stream_socket_final() override = default;
     167                 : 
     168              60 :     std::error_code set_option(
     169                 :         int level, int optname,
     170                 :         void const* data, std::size_t size) noexcept override
     171                 :     {
     172              60 :         return hook_.on_set_option(this->fd_, level, optname, data, size);
     173                 :     }
     174                 : 
     175                 :     // Overrides local_stream_socket::implementation::release_socket().
     176                 :     // Cannot use 'override' — tcp_socket::implementation has no such method.
     177                 :     // NOLINTNEXTLINE(modernize-use-override)
     178               2 :     native_handle_type release_socket() noexcept
     179                 :     {
     180               2 :         return this->do_release_socket();
     181                 :     }
     182                 : };
     183                 : 
     184                 : // ============================================================
     185                 : // Datagram socket final
     186                 : // ============================================================
     187                 : 
     188                 : template<class Traits, class ImplBase, class Endpoint>
     189                 : class reactor_dgram_socket_final final
     190                 :     : public reactor_datagram_socket<
     191                 :           reactor_dgram_socket_final<Traits, ImplBase, Endpoint>,
     192                 :           std::conditional_t<std::is_same_v<Endpoint, endpoint>,
     193                 :               reactor_udp_service_final<
     194                 :                   Traits, reactor_dgram_socket_final<Traits, ImplBase, Endpoint>>,
     195                 :               reactor_local_dgram_service_final<
     196                 :                   Traits, reactor_dgram_socket_final<Traits, ImplBase, Endpoint>>>,
     197                 :           dgram_connect_op<Traits, Endpoint>,
     198                 :           dgram_send_to_op<Traits, Endpoint>,
     199                 :           dgram_recv_from_op<Traits, Endpoint>,
     200                 :           dgram_send_op<Traits, Endpoint>,
     201                 :           dgram_recv_op<Traits, Endpoint>,
     202                 :           typename Traits::desc_state_type,
     203                 :           ImplBase,
     204                 :           Endpoint>
     205                 : {
     206                 :     using service_type = std::conditional_t<std::is_same_v<Endpoint, endpoint>,
     207                 :         reactor_udp_service_final<Traits, reactor_dgram_socket_final>,
     208                 :         reactor_local_dgram_service_final<Traits, reactor_dgram_socket_final>>;
     209                 :     friend service_type;
     210                 : 
     211                 : public:
     212                 :     using impl_base_type = ImplBase;
     213                 : 
     214             120 :     explicit reactor_dgram_socket_final(service_type& svc) noexcept
     215             120 :         : reactor_dgram_socket_final::reactor_datagram_socket(svc)
     216                 :     {
     217             120 :     }
     218                 : 
     219             120 :     ~reactor_dgram_socket_final() override = default;
     220                 : 
     221                 :     // Overrides local_datagram_socket pure virtuals.
     222                 :     // Cannot use 'override' — udp_socket::implementation has no such methods.
     223                 :     // NOLINTNEXTLINE(modernize-use-override)
     224 MIS           0 :     std::error_code shutdown(corosio::shutdown_type what) noexcept
     225                 :     {
     226               0 :         return this->do_shutdown(static_cast<int>(what));
     227                 :     }
     228                 : 
     229                 :     // NOLINTNEXTLINE(modernize-use-override)
     230               0 :     std::error_code bind(Endpoint ep) noexcept
     231                 :     {
     232               0 :         return this->do_bind(ep);
     233                 :     }
     234                 : 
     235                 :     // NOLINTNEXTLINE(modernize-use-override)
     236               0 :     native_handle_type release_socket() noexcept
     237                 :     {
     238               0 :         return this->do_release_socket();
     239                 :     }
     240                 : };
     241                 : 
     242                 : // ============================================================
     243                 : // Acceptor final
     244                 : // ============================================================
     245                 : 
     246                 : template<class Traits, class Endpoint>
     247                 : using stream_service_for = std::conditional_t<std::is_same_v<Endpoint, endpoint>,
     248                 :     reactor_tcp_service_final<Traits, stream_socket_t<Traits, Endpoint>>,
     249                 :     reactor_local_stream_service_final<Traits, stream_socket_t<Traits, Endpoint>>>;
     250                 : 
     251                 : template<class Traits, class AccImplBase, class Endpoint>
     252                 : class reactor_acceptor_final final
     253                 :     : public reactor_acceptor<
     254                 :           reactor_acceptor_final<Traits, AccImplBase, Endpoint>,
     255                 :           reactor_acceptor_service_final<
     256                 :               Traits,
     257                 :               std::conditional_t<std::is_same_v<Endpoint, endpoint>,
     258                 :                   tcp_acceptor_service, local_stream_acceptor_service>,
     259                 :               reactor_acceptor_final<Traits, AccImplBase, Endpoint>,
     260                 :               stream_service_for<Traits, Endpoint>,
     261                 :               Endpoint>,
     262                 :           stream_base_op<Traits, Endpoint>,
     263                 :           stream_accept_op<Traits, Endpoint>,
     264                 :           typename Traits::desc_state_type,
     265                 :           AccImplBase,
     266                 :           Endpoint>
     267                 : {
     268                 :     using acc_service_type = reactor_acceptor_service_final<
     269                 :         Traits,
     270                 :         std::conditional_t<std::is_same_v<Endpoint, endpoint>,
     271                 :             tcp_acceptor_service, local_stream_acceptor_service>,
     272                 :         reactor_acceptor_final,
     273                 :         stream_service_for<Traits, Endpoint>,
     274                 :         Endpoint>;
     275                 :     friend acc_service_type;
     276                 : 
     277                 : public:
     278 HIT         163 :     explicit reactor_acceptor_final(acc_service_type& svc) noexcept
     279             163 :         : reactor_acceptor_final::reactor_acceptor(svc)
     280                 :     {
     281             163 :     }
     282                 : 
     283             163 :     ~reactor_acceptor_final() override = default;
     284                 : 
     285                 :     using impl_base_type = AccImplBase;
     286                 : 
     287                 :     // NOLINTNEXTLINE(modernize-use-override)
     288 MIS           0 :     native_handle_type release_socket() noexcept
     289                 :     {
     290               0 :         return this->do_release_socket();
     291                 :     }
     292                 : 
     293                 :     std::coroutine_handle<> accept(
     294                 :         std::coroutine_handle<>,
     295                 :         capy::executor_ref,
     296                 :         std::stop_token,
     297                 :         std::error_code*,
     298                 :         io_object::implementation**) override;
     299                 : };
     300                 : 
     301                 : } // namespace boost::corosio::detail
     302                 : 
     303                 : #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SOCKET_FINALS_HPP
        

Generated by: LCOV version 2.3