Extract epoll completion handling into a helper

This commit is contained in:
Avi Kivity
2014-08-18 14:46:02 +03:00
parent 96b813fbfc
commit b9ebc652cb
2 changed files with 13 additions and 12 deletions

View File

@@ -69,6 +69,16 @@ reactor::listen(socket_address sa, listen_options opts) {
return pollable_fd(fd);
}
void reactor::complete_epoll_event(pollable_fd_state& pfd, promise<void> pollable_fd_state::*pr,
int events, int event) {
if (pfd.events_requested & events & event) {
pfd.events_requested &= ~EPOLLIN;
pfd.events_known &= ~EPOLLIN;
(pfd.*pr).set_value();
pfd.*pr = promise<void>();
}
}
void reactor::run() {
std::vector<std::unique_ptr<task>> current_tasks;
while (true) {
@@ -90,18 +100,8 @@ void reactor::run() {
std::unique_ptr<task> t_in, t_out;
pfd->events_known |= events;
auto events_to_remove = events & ~pfd->events_requested;
if (pfd->events_requested & events & EPOLLIN) {
pfd->events_requested &= ~EPOLLIN;
pfd->events_known &= ~EPOLLIN;
pfd->pollin.set_value();
pfd->pollin = promise<void>();
}
if (pfd->events_requested & events & EPOLLOUT) {
pfd->events_requested &= ~EPOLLOUT;
pfd->events_known &= ~EPOLLOUT;
pfd->pollout.set_value();
pfd->pollout = promise<void>();
}
complete_epoll_event(*pfd, &pollable_fd_state::pollin, events, EPOLLIN);
complete_epoll_event(*pfd, &pollable_fd_state::pollout, events, EPOLLOUT);
if (events_to_remove) {
pfd->events_epoll &= ~events_to_remove;
evt.events = pfd->events_epoll;

View File

@@ -430,6 +430,7 @@ public:
std::vector<std::unique_ptr<task>> _pending_tasks;
private:
future<void> get_epoll_future(pollable_fd_state& fd, promise<void> pollable_fd_state::* pr, int event);
void complete_epoll_event(pollable_fd_state& fd, promise<void> pollable_fd_state::* pr, int events, int event);
future<void> readable(pollable_fd_state& fd);
future<void> writeable(pollable_fd_state& fd);
void forget(pollable_fd_state& fd);