Allow to use epoll_manager without ringloop
parent
9336ee5476
commit
8aa4d492c1
|
@ -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); });
|
||||
|
||||
consumer.loop = [this]()
|
||||
if (ringloop)
|
||||
{
|
||||
if (pending)
|
||||
handle_epoll_events();
|
||||
};
|
||||
ringloop->register_consumer(&consumer);
|
||||
|
||||
handle_epoll_events();
|
||||
consumer.loop = [this]()
|
||||
{
|
||||
if (pending)
|
||||
handle_uring_event();
|
||||
};
|
||||
ringloop->register_consumer(&consumer);
|
||||
handle_uring_event();
|
||||
}
|
||||
}
|
||||
|
||||
epoll_manager_t::~epoll_manager_t()
|
||||
{
|
||||
ringloop->unregister_consumer(&consumer);
|
||||
if (ringloop)
|
||||
{
|
||||
ringloop->unregister_consumer(&consumer);
|
||||
}
|
||||
if (tfd)
|
||||
{
|
||||
delete tfd;
|
||||
|
@ -44,6 +49,11 @@ epoll_manager_t::~epoll_manager_t()
|
|||
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)
|
||||
{
|
||||
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();
|
||||
if (!sqe)
|
||||
|
@ -95,14 +105,20 @@ void epoll_manager_t::handle_epoll_events()
|
|||
{
|
||||
throw std::runtime_error(std::string("epoll failed: ") + strerror(-data->res));
|
||||
}
|
||||
handle_epoll_events();
|
||||
handle_uring_event();
|
||||
};
|
||||
ringloop->submit();
|
||||
handle_events(0);
|
||||
}
|
||||
|
||||
void epoll_manager_t::handle_events(int timeout)
|
||||
{
|
||||
int nfds;
|
||||
epoll_event events[MAX_EPOLL_EVENTS];
|
||||
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++)
|
||||
{
|
||||
auto cb_it = epoll_handlers.find(events[i].data.fd);
|
||||
|
|
|
@ -15,11 +15,14 @@ class epoll_manager_t
|
|||
ring_consumer_t consumer;
|
||||
ring_loop_t *ringloop;
|
||||
std::map<int, std::function<void(int, int)>> epoll_handlers;
|
||||
|
||||
void handle_uring_event();
|
||||
public:
|
||||
epoll_manager_t(ring_loop_t *ringloop);
|
||||
~epoll_manager_t();
|
||||
int get_fd();
|
||||
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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue