include/boost/corosio/native/detail/epoll/epoll_socket.hpp

100.0% Lines (13/13) 100.0% Functions (5/5)
include/boost/corosio/native/detail/epoll/epoll_socket.hpp
Line TLA 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_EPOLL_EPOLL_SOCKET_HPP
11 #define BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_SOCKET_HPP
12
13 #include <boost/corosio/detail/platform.hpp>
14
15 #if BOOST_COROSIO_HAS_EPOLL
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/epoll/epoll_op.hpp>
22
23 #include <memory>
24
25 namespace boost::corosio::detail {
26
27 class epoll_socket_service;
28
29 /// Socket implementation for epoll backend.
30 class epoll_socket final
31 : public tcp_socket::implementation
32 , public std::enable_shared_from_this<epoll_socket>
33 , public intrusive_list<epoll_socket>::node
34 {
35 friend class epoll_socket_service;
36
37 public:
38 explicit epoll_socket(epoll_socket_service& svc) noexcept;
39 ~epoll_socket() override;
40
41 std::coroutine_handle<> connect(
42 std::coroutine_handle<>,
43 capy::executor_ref,
44 endpoint,
45 std::stop_token,
46 std::error_code*) override;
47
48 std::coroutine_handle<> read_some(
49 std::coroutine_handle<>,
50 capy::executor_ref,
51 buffer_param,
52 std::stop_token,
53 std::error_code*,
54 std::size_t*) override;
55
56 std::coroutine_handle<> write_some(
57 std::coroutine_handle<>,
58 capy::executor_ref,
59 buffer_param,
60 std::stop_token,
61 std::error_code*,
62 std::size_t*) override;
63
64 std::error_code shutdown(tcp_socket::shutdown_type what) noexcept override;
65
66 28830 native_handle_type native_handle() const noexcept override
67 {
68 28830 return fd_;
69 }
70
71 std::error_code set_option(
72 int level,
73 int optname,
74 void const* data,
75 std::size_t size) noexcept override;
76 std::error_code
77 get_option(int level, int optname, void* data, std::size_t* size)
78 const noexcept override;
79
80 19 endpoint local_endpoint() const noexcept override
81 {
82 19 return local_endpoint_;
83 }
84 21 endpoint remote_endpoint() const noexcept override
85 {
86 21 return remote_endpoint_;
87 }
88 bool is_open() const noexcept
89 {
90 return fd_ >= 0;
91 }
92 void cancel() noexcept override;
93 void cancel_single_op(epoll_op& op) noexcept;
94 void close_socket() noexcept;
95 4733 void set_socket(int fd) noexcept
96 {
97 4733 fd_ = fd;
98 4733 }
99 9466 void set_endpoints(endpoint local, endpoint remote) noexcept
100 {
101 9466 local_endpoint_ = local;
102 9466 remote_endpoint_ = remote;
103 9466 }
104
105 epoll_connect_op conn_;
106 epoll_read_op rd_;
107 epoll_write_op wr_;
108
109 /// Per-descriptor state for persistent epoll registration
110 descriptor_state desc_state_;
111
112 private:
113 epoll_socket_service& svc_;
114 int fd_ = -1;
115 endpoint local_endpoint_;
116 endpoint remote_endpoint_;
117
118 void register_op(
119 epoll_op& op,
120 epoll_op*& desc_slot,
121 bool& ready_flag,
122 bool& cancel_flag) noexcept;
123
124 friend struct epoll_op;
125 friend struct epoll_connect_op;
126 };
127
128 } // namespace boost::corosio::detail
129
130 #endif // BOOST_COROSIO_HAS_EPOLL
131
132 #endif // BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_SOCKET_HPP
133