include/boost/corosio/native/detail/select/select_socket.hpp

100.0% Lines (13/13) 100.0% Functions (5/5)
include/boost/corosio/native/detail/select/select_socket.hpp
Line Hits 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 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
128