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_ACCEPTOR_HPP
10  
#ifndef BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_ACCEPTOR_HPP
11  
#define BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_ACCEPTOR_HPP
11  
#define BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_ACCEPTOR_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_acceptor.hpp>
17 +
#include <boost/corosio/native/detail/reactor/reactor_acceptor.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_acceptor_service;
23  
class epoll_acceptor_service;
28  

24  

29  
/// Acceptor implementation for epoll backend.
25  
/// Acceptor implementation for epoll backend.
30  
class epoll_acceptor final
26  
class epoll_acceptor final
31 -
    : public tcp_acceptor::implementation
27 +
    : public reactor_acceptor<
32 -
    , public std::enable_shared_from_this<epoll_acceptor>
28 +
        epoll_acceptor,
33 -
    , public intrusive_list<epoll_acceptor>::node
29 +
        epoll_acceptor_service,
 
30 +
        epoll_op,
 
31 +
        epoll_accept_op,
 
32 +
        descriptor_state>
34  
{
33  
{
35  
    friend class epoll_acceptor_service;
34  
    friend class epoll_acceptor_service;
36  

35  

37  
public:
36  
public:
38  
    explicit epoll_acceptor(epoll_acceptor_service& svc) noexcept;
37  
    explicit epoll_acceptor(epoll_acceptor_service& svc) noexcept;
39  

38  

40  
    std::coroutine_handle<> accept(
39  
    std::coroutine_handle<> accept(
41  
        std::coroutine_handle<>,
40  
        std::coroutine_handle<>,
42  
        capy::executor_ref,
41  
        capy::executor_ref,
43  
        std::stop_token,
42  
        std::stop_token,
44  
        std::error_code*,
43  
        std::error_code*,
45  
        io_object::implementation**) override;
44  
        io_object::implementation**) override;
46 -
    int native_handle() const noexcept
 
47 -
    {
 
48 -
        return fd_;
 
49 -
    }
 
50 -
    endpoint local_endpoint() const noexcept override
 
51 -
    {
 
52 -
        return local_endpoint_;
 
53 -
    }
 
54 -
    bool is_open() const noexcept override
 
55 -
    {
 
56 -
        return fd_ >= 0;
 
57 -
    }
 
58  

45  

59 -

 
60 -
    std::error_code set_option(
 
61 -
        int level,
 
62 -
        int optname,
 
63 -
        void const* data,
 
64 -
        std::size_t size) noexcept override;
 
65 -
    std::error_code
 
66 -
    get_option(int level, int optname, void* data, std::size_t* size)
 
67 -
        const noexcept override;
 
68 -
    void cancel_single_op(epoll_op& op) noexcept;
 
69  
    void cancel() noexcept override;
46  
    void cancel() noexcept override;
70 -
    void set_local_endpoint(endpoint ep) noexcept
 
71 -
    {
 
72 -
        local_endpoint_ = ep;
 
73 -
    }
 
74 -

 
75 -
    epoll_acceptor_service& service() noexcept
 
76 -
    {
 
77 -
        return svc_;
 
78 -
    }
 
79 -

 
80 -
    epoll_accept_op acc_;
 
81 -
    descriptor_state desc_state_;
 
82 -

 
83 -
private:
 
84 -
    epoll_acceptor_service& svc_;
 
85 -
    int fd_ = -1;
 
86 -
    endpoint local_endpoint_;
 
87  
    void close_socket() noexcept;
47  
    void close_socket() noexcept;
88  
};
48  
};
89  

49  

90  
} // namespace boost::corosio::detail
50  
} // namespace boost::corosio::detail
91  

51  

92  
#endif // BOOST_COROSIO_HAS_EPOLL
52  
#endif // BOOST_COROSIO_HAS_EPOLL
93  

53  

94  
#endif // BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_ACCEPTOR_HPP
54  
#endif // BOOST_COROSIO_NATIVE_DETAIL_EPOLL_EPOLL_ACCEPTOR_HPP