From b9ebc652cbbcd3e1372de496fed7ae0876c98de3 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Mon, 18 Aug 2014 14:46:02 +0300 Subject: [PATCH] Extract epoll completion handling into a helper --- reactor.cc | 24 ++++++++++++------------ reactor.hh | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/reactor.cc b/reactor.cc index 331b025b5e..c50847f7be 100644 --- a/reactor.cc +++ b/reactor.cc @@ -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 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 reactor::run() { std::vector> current_tasks; while (true) { @@ -90,18 +100,8 @@ void reactor::run() { std::unique_ptr 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(); - } - if (pfd->events_requested & events & EPOLLOUT) { - pfd->events_requested &= ~EPOLLOUT; - pfd->events_known &= ~EPOLLOUT; - pfd->pollout.set_value(); - pfd->pollout = promise(); - } + 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; diff --git a/reactor.hh b/reactor.hh index 18019ece80..f9fdbea571 100644 --- a/reactor.hh +++ b/reactor.hh @@ -430,6 +430,7 @@ public: std::vector> _pending_tasks; private: future get_epoll_future(pollable_fd_state& fd, promise pollable_fd_state::* pr, int event); + void complete_epoll_event(pollable_fd_state& fd, promise pollable_fd_state::* pr, int events, int event); future readable(pollable_fd_state& fd); future writeable(pollable_fd_state& fd); void forget(pollable_fd_state& fd);