sys_util: have Poller return token on POLLHUP

If POLLHUP is filtered out of the returned tokens, the caller of
Poller::poll will likely just put the same (token, fd) in the next call
to poll which will return instantly. This degrades into a busy poll loop
without the chance for the caller to change the poll list.

Instead, this change changes the filter to return tokens on POLLHUP so
that the caller will hopefully notice the FD associated with the token
has been hungup and will close it.

BUG=chromium:816692
TEST=None

Change-Id: Ie36d8a647a5fd7faabfd57a562205f75c77991e7
Reviewed-on: https://chromium-review.googlesource.com/985616
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Stephen Barber <smbarber@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
This commit is contained in:
Zach Reizner 2018-03-28 17:16:20 -07:00 committed by chrome-bot
parent 3afab33a8d
commit 1028f53ed2

View file

@ -16,7 +16,7 @@ use std::thread;
use std::time::Duration;
use libc::{c_int, c_long, timespec, time_t, nfds_t, sigset_t, pollfd, syscall, SYS_ppoll, POLLIN,
EPOLL_CLOEXEC, EPOLLIN, EPOLLHUP, EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL,
POLLHUP, EPOLL_CLOEXEC, EPOLLIN, EPOLLHUP, EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL,
epoll_create1, epoll_ctl, epoll_wait, epoll_event};
use {Result, errno_result};
@ -140,7 +140,7 @@ impl Poller {
self.tokens.clear();
for (pollfd, pollable) in self.pollfds.iter().zip(pollables.iter()) {
if (pollfd.revents & POLLIN) != 0 {
if (pollfd.revents & (POLLIN | POLLHUP)) != 0 {
self.tokens.push(pollable.0);
}
}