Allow to use epoll_manager without ringloop

hotfix-1.1.0
Vitaliy Filippov 2023-10-26 17:54:10 +03:00
parent 9336ee5476
commit 8aa4d492c1
2 changed files with 31 additions and 12 deletions

View File

@ -23,19 +23,24 @@ epoll_manager_t::epoll_manager_t(ring_loop_t *ringloop)
tfd = new timerfd_manager_t([this](int fd, bool wr, std::function<void(int, int)> handler) { set_fd_handler(fd, wr, handler); }); tfd = new timerfd_manager_t([this](int fd, bool wr, std::function<void(int, int)> handler) { set_fd_handler(fd, wr, handler); });
consumer.loop = [this]() if (ringloop)
{ {
if (pending) consumer.loop = [this]()
handle_epoll_events(); {
}; if (pending)
ringloop->register_consumer(&consumer); handle_uring_event();
};
handle_epoll_events(); ringloop->register_consumer(&consumer);
handle_uring_event();
}
} }
epoll_manager_t::~epoll_manager_t() epoll_manager_t::~epoll_manager_t()
{ {
ringloop->unregister_consumer(&consumer); if (ringloop)
{
ringloop->unregister_consumer(&consumer);
}
if (tfd) if (tfd)
{ {
delete tfd; delete tfd;
@ -44,6 +49,11 @@ epoll_manager_t::~epoll_manager_t()
close(epoll_fd); close(epoll_fd);
} }
int epoll_manager_t::get_fd()
{
return epoll_fd;
}
void epoll_manager_t::set_fd_handler(int fd, bool wr, std::function<void(int, int)> handler) void epoll_manager_t::set_fd_handler(int fd, bool wr, std::function<void(int, int)> handler)
{ {
if (handler != NULL) if (handler != NULL)
@ -75,7 +85,7 @@ void epoll_manager_t::set_fd_handler(int fd, bool wr, std::function<void(int, in
} }
} }
void epoll_manager_t::handle_epoll_events() void epoll_manager_t::handle_uring_event()
{ {
io_uring_sqe *sqe = ringloop->get_sqe(); io_uring_sqe *sqe = ringloop->get_sqe();
if (!sqe) if (!sqe)
@ -95,14 +105,20 @@ void epoll_manager_t::handle_epoll_events()
{ {
throw std::runtime_error(std::string("epoll failed: ") + strerror(-data->res)); throw std::runtime_error(std::string("epoll failed: ") + strerror(-data->res));
} }
handle_epoll_events(); handle_uring_event();
}; };
ringloop->submit(); ringloop->submit();
handle_events(0);
}
void epoll_manager_t::handle_events(int timeout)
{
int nfds; int nfds;
epoll_event events[MAX_EPOLL_EVENTS]; epoll_event events[MAX_EPOLL_EVENTS];
do do
{ {
nfds = epoll_wait(epoll_fd, events, MAX_EPOLL_EVENTS, 0); nfds = epoll_wait(epoll_fd, events, MAX_EPOLL_EVENTS, timeout);
timeout = 0;
for (int i = 0; i < nfds; i++) for (int i = 0; i < nfds; i++)
{ {
auto cb_it = epoll_handlers.find(events[i].data.fd); auto cb_it = epoll_handlers.find(events[i].data.fd);

View File

@ -15,11 +15,14 @@ class epoll_manager_t
ring_consumer_t consumer; ring_consumer_t consumer;
ring_loop_t *ringloop; ring_loop_t *ringloop;
std::map<int, std::function<void(int, int)>> epoll_handlers; std::map<int, std::function<void(int, int)>> epoll_handlers;
void handle_uring_event();
public: public:
epoll_manager_t(ring_loop_t *ringloop); epoll_manager_t(ring_loop_t *ringloop);
~epoll_manager_t(); ~epoll_manager_t();
int get_fd();
void set_fd_handler(int fd, bool wr, std::function<void(int, int)> handler); void set_fd_handler(int fd, bool wr, std::function<void(int, int)> handler);
void handle_epoll_events(); void handle_events(int timeout);
timerfd_manager_t *tfd; timerfd_manager_t *tfd;
}; };