1  
//
1  
//
2  
// Copyright (c) 2026 Steve Gerbino
2  
// Copyright (c) 2026 Steve Gerbino
3  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/cppalliance/corosio
7  
// Official repository: https://github.com/cppalliance/corosio
8  
//
8  
//
9  

9  

10  
#ifndef BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_SOCKET_HPP
10  
#ifndef BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_SOCKET_HPP
11  
#define BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_SOCKET_HPP
11  
#define BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_SOCKET_HPP
12  

12  

13  
#include <boost/corosio/detail/platform.hpp>
13  
#include <boost/corosio/detail/platform.hpp>
14  

14  

15  
#if BOOST_COROSIO_HAS_EPOLL
15  
#if BOOST_COROSIO_HAS_EPOLL
16  

16  

17 -
#include <boost/corosio/tcp_socket.hpp>
17 +
#include <boost/corosio/native/detail/reactor/reactor_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>
18  
#include <boost/corosio/native/detail/epoll/epoll_op.hpp>
22 -

19 +
#include <boost/capy/ex/executor_ref.hpp>
23 -
#include <memory>
 
24  

20  

25  
namespace boost::corosio::detail {
21  
namespace boost::corosio::detail {
26  

22  

27  
class epoll_socket_service;
23  
class epoll_socket_service;
28  

24  

29  
/// Socket implementation for epoll backend.
25  
/// Socket implementation for epoll backend.
30  
class epoll_socket final
26  
class epoll_socket final
31 -
    : public tcp_socket::implementation
27 +
    : public reactor_socket<
32 -
    , public std::enable_shared_from_this<epoll_socket>
28 +
        epoll_socket,
33 -
    , public intrusive_list<epoll_socket>::node
29 +
        epoll_socket_service,
 
30 +
        epoll_op,
 
31 +
        epoll_connect_op,
 
32 +
        epoll_read_op,
 
33 +
        epoll_write_op,
 
34 +
        descriptor_state>
34  
{
35  
{
35  
    friend class epoll_socket_service;
36  
    friend class epoll_socket_service;
36  

37  

37  
public:
38  
public:
38  
    explicit epoll_socket(epoll_socket_service& svc) noexcept;
39  
    explicit epoll_socket(epoll_socket_service& svc) noexcept;
39  
    ~epoll_socket() override;
40  
    ~epoll_socket() override;
40  

41  

41  
    std::coroutine_handle<> connect(
42  
    std::coroutine_handle<> connect(
42  
        std::coroutine_handle<>,
43  
        std::coroutine_handle<>,
43  
        capy::executor_ref,
44  
        capy::executor_ref,
44  
        endpoint,
45  
        endpoint,
45  
        std::stop_token,
46  
        std::stop_token,
46  
        std::error_code*) override;
47  
        std::error_code*) override;
47  

48  

48  
    std::coroutine_handle<> read_some(
49  
    std::coroutine_handle<> read_some(
49  
        std::coroutine_handle<>,
50  
        std::coroutine_handle<>,
50  
        capy::executor_ref,
51  
        capy::executor_ref,
51  
        buffer_param,
52  
        buffer_param,
52  
        std::stop_token,
53  
        std::stop_token,
53  
        std::error_code*,
54  
        std::error_code*,
54  
        std::size_t*) override;
55  
        std::size_t*) override;
55  

56  

56  
    std::coroutine_handle<> write_some(
57  
    std::coroutine_handle<> write_some(
57  
        std::coroutine_handle<>,
58  
        std::coroutine_handle<>,
58  
        capy::executor_ref,
59  
        capy::executor_ref,
59  
        buffer_param,
60  
        buffer_param,
60  
        std::stop_token,
61  
        std::stop_token,
61  
        std::error_code*,
62  
        std::error_code*,
62  
        std::size_t*) override;
63  
        std::size_t*) override;
63 -
    std::error_code shutdown(tcp_socket::shutdown_type what) noexcept override;
 
64 -

 
65 -
    native_handle_type native_handle() const noexcept override
 
66 -
    {
 
67 -
        return fd_;
 
68 -
    }
 
69 -

 
70 -
    std::error_code set_option(
 
71 -
        int level,
 
72 -
        int optname,
 
73 -
        void const* data,
 
74 -
        std::size_t size) noexcept override;
 
75 -
    std::error_code
 
76 -
    get_option(int level, int optname, void* data, std::size_t* size)
 
77 -
        const noexcept override;
 
78 -

 
79 -
    endpoint local_endpoint() const noexcept override
 
80 -
    {
 
81 -
        return local_endpoint_;
 
82 -
    }
 
83 -
    endpoint remote_endpoint() const noexcept override
 
84 -
    {
 
85 -
        return remote_endpoint_;
 
86 -
    }
 
87 -
    bool is_open() const noexcept
 
88 -
    {
 
89 -
        return fd_ >= 0;
 
90 -
    }
 
91  

64  

92 -
    void cancel_single_op(epoll_op& op) noexcept;
 
93  
    void cancel() noexcept override;
65  
    void cancel() noexcept override;
94 -
    void set_socket(int fd) noexcept
 
95 -
    {
 
96 -
        fd_ = fd;
 
97 -
    }
 
98 -
    void set_endpoints(endpoint local, endpoint remote) noexcept
 
99 -
    {
 
100 -
        local_endpoint_  = local;
 
101 -
        remote_endpoint_ = remote;
 
102 -
    }
 
103 -

 
104 -
    epoll_connect_op conn_;
 
105 -
    epoll_read_op rd_;
 
106 -
    epoll_write_op wr_;
 
107 -

 
108 -
    /// Per-descriptor state for persistent epoll registration
 
109 -
    descriptor_state desc_state_;
 
110 -

 
111 -
private:
 
112 -
    epoll_socket_service& svc_;
 
113 -
    int fd_ = -1;
 
114 -
    endpoint local_endpoint_;
 
115 -
    endpoint remote_endpoint_;
 
116 -

 
117 -
    void register_op(
 
118 -
        epoll_op& op,
 
119 -
        epoll_op*& desc_slot,
 
120 -
        bool& ready_flag,
 
121 -
        bool& cancel_flag) noexcept;
 
122 -

 
123 -
    friend struct epoll_op;
 
124 -
    friend struct epoll_connect_op;
 
125  
    void close_socket() noexcept;
66  
    void close_socket() noexcept;
126  
};
67  
};
127  

68  

128  
} // namespace boost::corosio::detail
69  
} // namespace boost::corosio::detail
129  

70  

130  
#endif // BOOST_COROSIO_HAS_EPOLL
71  
#endif // BOOST_COROSIO_HAS_EPOLL
131  

72  

132  
#endif // BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_SOCKET_HPP
73  
#endif // BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_SOCKET_HPP