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_SELECT_SELECT_ACCEPTOR_HPP
10  
#ifndef BOOST_COROSIO_NATIVE_DETAIL_SELECT_SELECT_ACCEPTOR_HPP
11  
#define BOOST_COROSIO_NATIVE_DETAIL_SELECT_SELECT_ACCEPTOR_HPP
11  
#define BOOST_COROSIO_NATIVE_DETAIL_SELECT_SELECT_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_SELECT
15  
#if BOOST_COROSIO_HAS_SELECT
16  

16  

17  
#include <boost/corosio/tcp_acceptor.hpp>
17  
#include <boost/corosio/tcp_acceptor.hpp>
18  
#include <boost/capy/ex/executor_ref.hpp>
18  
#include <boost/capy/ex/executor_ref.hpp>
19  
#include <boost/corosio/detail/intrusive.hpp>
19  
#include <boost/corosio/detail/intrusive.hpp>
20  

20  

21  
#include <boost/corosio/native/detail/select/select_op.hpp>
21  
#include <boost/corosio/native/detail/select/select_op.hpp>
22  

22  

23  
#include <memory>
23  
#include <memory>
24  

24  

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

26  

27  
class select_acceptor_service;
27  
class select_acceptor_service;
28  
class select_socket_service;
28  
class select_socket_service;
29  

29  

30  
/// Acceptor implementation for select backend.
30  
/// Acceptor implementation for select backend.
31  
class select_acceptor final
31  
class select_acceptor final
32  
    : public tcp_acceptor::implementation
32  
    : public tcp_acceptor::implementation
33  
    , public std::enable_shared_from_this<select_acceptor>
33  
    , public std::enable_shared_from_this<select_acceptor>
34  
    , public intrusive_list<select_acceptor>::node
34  
    , public intrusive_list<select_acceptor>::node
35  
{
35  
{
36  
    friend class select_acceptor_service;
36  
    friend class select_acceptor_service;
37  

37  

38  
public:
38  
public:
39  
    explicit select_acceptor(select_acceptor_service& svc) noexcept;
39  
    explicit select_acceptor(select_acceptor_service& svc) noexcept;
40  

40  

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

47  

48  
    int native_handle() const noexcept
48  
    int native_handle() const noexcept
49  
    {
49  
    {
50  
        return fd_;
50  
        return fd_;
51  
    }
51  
    }
52  
    endpoint local_endpoint() const noexcept override
52  
    endpoint local_endpoint() const noexcept override
53  
    {
53  
    {
54  
        return local_endpoint_;
54  
        return local_endpoint_;
55  
    }
55  
    }
56  
    bool is_open() const noexcept override
56  
    bool is_open() const noexcept override
57  
    {
57  
    {
58  
        return fd_ >= 0;
58  
        return fd_ >= 0;
59  
    }
59  
    }
60  
    void cancel() noexcept override;
60  
    void cancel() noexcept override;
61  
    void cancel_single_op(select_op& op) noexcept;
61  
    void cancel_single_op(select_op& op) noexcept;
62  
    void close_socket() noexcept;
62  
    void close_socket() noexcept;
63  
    void set_local_endpoint(endpoint ep) noexcept
63  
    void set_local_endpoint(endpoint ep) noexcept
64  
    {
64  
    {
65  
        local_endpoint_ = ep;
65  
        local_endpoint_ = ep;
66  
    }
66  
    }
67  

67  

68  
    select_acceptor_service& service() noexcept
68  
    select_acceptor_service& service() noexcept
69  
    {
69  
    {
70  
        return svc_;
70  
        return svc_;
71  
    }
71  
    }
72  

72  

73  
    select_accept_op acc_;
73  
    select_accept_op acc_;
74  

74  

75  
private:
75  
private:
76  
    select_acceptor_service& svc_;
76  
    select_acceptor_service& svc_;
77  
    int fd_ = -1;
77  
    int fd_ = -1;
78  
    endpoint local_endpoint_;
78  
    endpoint local_endpoint_;
79  
};
79  
};
80  

80  

81  
} // namespace boost::corosio::detail
81  
} // namespace boost::corosio::detail
82  

82  

83  
#endif // BOOST_COROSIO_HAS_SELECT
83  
#endif // BOOST_COROSIO_HAS_SELECT
84  

84  

85  
#endif // BOOST_COROSIO_NATIVE_DETAIL_SELECT_SELECT_ACCEPTOR_HPP
85  
#endif // BOOST_COROSIO_NATIVE_DETAIL_SELECT_SELECT_ACCEPTOR_HPP