Commit fcfdc196 authored by Mike Rapoport's avatar Mike Rapoport Committed by Andrei Vagin

util: epoll_run: allow interrupting event polling

If an event handler returns a positive value, the event polling and
handling loop is interrupted after all the pending events indicated by
epoll_wait are processed.

travis-ci: success for lazy-pages: add non-#PF events handling
Signed-off-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 82668f67
...@@ -1231,6 +1231,7 @@ int epoll_add_rfd(int epfd, struct epoll_rfd *rfd) ...@@ -1231,6 +1231,7 @@ int epoll_add_rfd(int epfd, struct epoll_rfd *rfd)
int epoll_run_rfds(int epollfd, struct epoll_event *evs, int nr_fds, int timeout) int epoll_run_rfds(int epollfd, struct epoll_event *evs, int nr_fds, int timeout)
{ {
int ret, i, nr_events; int ret, i, nr_events;
bool have_a_break = false;
while (1) { while (1) {
/* FIXME -- timeout should decrease over time... */ /* FIXME -- timeout should decrease over time... */
...@@ -1251,7 +1252,12 @@ int epoll_run_rfds(int epollfd, struct epoll_event *evs, int nr_fds, int timeout ...@@ -1251,7 +1252,12 @@ int epoll_run_rfds(int epollfd, struct epoll_event *evs, int nr_fds, int timeout
ret = rfd->revent(rfd); ret = rfd->revent(rfd);
if (ret < 0) if (ret < 0)
goto out; goto out;
if (ret > 0)
have_a_break = true;
} }
if (have_a_break)
return 1;
} }
out: out:
return ret; return ret;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment