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); });
|
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);
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue