Skip to content

Commit 8199f3c

Browse files
committed
Consolidate epoll, kqueue, and select into shared reactor layer
Introduce a shared reactor/ directory with CRTP templates that capture the common structure of all three POSIX backends: operation state, descriptor state, socket/acceptor impls, service ownership, and the full scheduler threading model. New shared headers: - reactor_op.hpp: base op with cancellation, stop_token, perform_io - reactor_descriptor_state.hpp: per-fd state with deferred I/O - reactor_socket.hpp: connect, read_some, write_some, cancel, close - reactor_acceptor.hpp: bind, listen, accept, cancel, close - reactor_service_state.hpp: service ownership (mutex, list, map) - reactor_scheduler.hpp: signal state machine, inline completion budget, work counting, run/poll event loop, cleanup guards Backend files become thin wrappers providing only platform-specific hooks: write policy (sendmsg flags), accept policy (accept4 vs accept+fcntl), and the reactor poll function (epoll_wait, kevent, select). All shared logic — speculative I/O, deferred I/O dispatch, cancellation, close, thread coordination — lives in the templates. Correctness fixes applied during normalization: - EINTR retry on kqueue read path - Release ordering on add_ready_events/is_enqueued_ (ARM correctness) - Exception-safe task_cleanup with private queue drain - stopped_ as plain bool (always under mutex)
1 parent ce1c43e commit 8199f3c

26 files changed

+3512
-6332
lines changed

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

Lines changed: 8 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,22 @@
1414

1515
#if BOOST_COROSIO_HAS_EPOLL
1616

17-
#include <boost/corosio/tcp_acceptor.hpp>
18-
#include <boost/capy/ex/executor_ref.hpp>
19-
#include <boost/corosio/detail/intrusive.hpp>
20-
17+
#include <boost/corosio/native/detail/reactor/reactor_acceptor.hpp>
2118
#include <boost/corosio/native/detail/epoll/epoll_op.hpp>
22-
23-
#include <memory>
19+
#include <boost/capy/ex/executor_ref.hpp>
2420

2521
namespace boost::corosio::detail {
2622

2723
class epoll_acceptor_service;
2824

2925
/// Acceptor implementation for epoll backend.
3026
class epoll_acceptor final
31-
: public tcp_acceptor::implementation
32-
, public std::enable_shared_from_this<epoll_acceptor>
33-
, public intrusive_list<epoll_acceptor>::node
27+
: public reactor_acceptor<
28+
epoll_acceptor,
29+
epoll_acceptor_service,
30+
epoll_op,
31+
epoll_accept_op,
32+
descriptor_state>
3433
{
3534
friend class epoll_acceptor_service;
3635

@@ -44,47 +43,8 @@ class epoll_acceptor final
4443
std::error_code*,
4544
io_object::implementation**) override;
4645

47-
int native_handle() const noexcept
48-
{
49-
return fd_;
50-
}
51-
endpoint local_endpoint() const noexcept override
52-
{
53-
return local_endpoint_;
54-
}
55-
bool is_open() const noexcept override
56-
{
57-
return fd_ >= 0;
58-
}
5946
void cancel() noexcept override;
60-
61-
std::error_code set_option(
62-
int level,
63-
int optname,
64-
void const* data,
65-
std::size_t size) noexcept override;
66-
std::error_code
67-
get_option(int level, int optname, void* data, std::size_t* size)
68-
const noexcept override;
69-
void cancel_single_op(epoll_op& op) noexcept;
7047
void close_socket() noexcept;
71-
void set_local_endpoint(endpoint ep) noexcept
72-
{
73-
local_endpoint_ = ep;
74-
}
75-
76-
epoll_acceptor_service& service() noexcept
77-
{
78-
return svc_;
79-
}
80-
81-
epoll_accept_op acc_;
82-
descriptor_state desc_state_;
83-
84-
private:
85-
epoll_acceptor_service& svc_;
86-
int fd_ = -1;
87-
endpoint local_endpoint_;
8848
};
8949

9050
} // namespace boost::corosio::detail

0 commit comments

Comments
 (0)