TLA Line data Source code
1 : //
2 : // Copyright (c) 2026 Steve Gerbino
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_SELECT_SELECT_SOCKET_HPP
11 : #define BOOST_COROSIO_NATIVE_DETAIL_SELECT_SELECT_SOCKET_HPP
12 :
13 : #include <boost/corosio/detail/platform.hpp>
14 :
15 : #if BOOST_COROSIO_HAS_SELECT
16 :
17 : #include <boost/corosio/tcp_socket.hpp>
18 : #include <boost/capy/ex/executor_ref.hpp>
19 : #include <boost/corosio/detail/intrusive.hpp>
20 :
21 : #include <boost/corosio/native/detail/select/select_op.hpp>
22 :
23 : #include <memory>
24 :
25 : namespace boost::corosio::detail {
26 :
27 : class select_socket_service;
28 :
29 : /// Socket implementation for select backend.
30 : class select_socket final
31 : : public tcp_socket::implementation
32 : , public std::enable_shared_from_this<select_socket>
33 : , public intrusive_list<select_socket>::node
34 : {
35 : friend class select_socket_service;
36 :
37 : public:
38 : explicit select_socket(select_socket_service& svc) noexcept;
39 :
40 : std::coroutine_handle<> connect(
41 : std::coroutine_handle<>,
42 : capy::executor_ref,
43 : endpoint,
44 : std::stop_token,
45 : std::error_code*) override;
46 :
47 : std::coroutine_handle<> read_some(
48 : std::coroutine_handle<>,
49 : capy::executor_ref,
50 : io_buffer_param,
51 : std::stop_token,
52 : std::error_code*,
53 : std::size_t*) override;
54 :
55 : std::coroutine_handle<> write_some(
56 : std::coroutine_handle<>,
57 : capy::executor_ref,
58 : io_buffer_param,
59 : std::stop_token,
60 : std::error_code*,
61 : std::size_t*) override;
62 :
63 : std::error_code shutdown(tcp_socket::shutdown_type what) noexcept override;
64 :
65 HIT 20977 : native_handle_type native_handle() const noexcept override
66 : {
67 20977 : return fd_;
68 : }
69 :
70 : // Socket options
71 : std::error_code set_no_delay(bool value) noexcept override;
72 : bool no_delay(std::error_code& ec) const noexcept override;
73 :
74 : std::error_code set_keep_alive(bool value) noexcept override;
75 : bool keep_alive(std::error_code& ec) const noexcept override;
76 :
77 : std::error_code set_receive_buffer_size(int size) noexcept override;
78 : int receive_buffer_size(std::error_code& ec) const noexcept override;
79 :
80 : std::error_code set_send_buffer_size(int size) noexcept override;
81 : int send_buffer_size(std::error_code& ec) const noexcept override;
82 :
83 : std::error_code set_linger(bool enabled, int timeout) noexcept override;
84 : tcp_socket::linger_options
85 : linger(std::error_code& ec) const noexcept override;
86 :
87 16 : endpoint local_endpoint() const noexcept override
88 : {
89 16 : return local_endpoint_;
90 : }
91 16 : endpoint remote_endpoint() const noexcept override
92 : {
93 16 : return remote_endpoint_;
94 : }
95 : bool is_open() const noexcept
96 : {
97 : return fd_ >= 0;
98 : }
99 : void cancel() noexcept override;
100 : void cancel_single_op(select_op& op) noexcept;
101 : void close_socket() noexcept;
102 3443 : void set_socket(int fd) noexcept
103 : {
104 3443 : fd_ = fd;
105 3443 : }
106 6886 : void set_endpoints(endpoint local, endpoint remote) noexcept
107 : {
108 6886 : local_endpoint_ = local;
109 6886 : remote_endpoint_ = remote;
110 6886 : }
111 :
112 : select_connect_op conn_;
113 : select_read_op rd_;
114 : select_write_op wr_;
115 :
116 : private:
117 : select_socket_service& svc_;
118 : int fd_ = -1;
119 : endpoint local_endpoint_;
120 : endpoint remote_endpoint_;
121 : };
122 :
123 : } // namespace boost::corosio::detail
124 :
125 : #endif // BOOST_COROSIO_HAS_SELECT
126 :
127 : #endif // BOOST_COROSIO_NATIVE_DETAIL_SELECT_SELECT_SOCKET_HPP
|