From 1028f53ed2bcdc3088f73f59f268f3e99d5c06c9 Mon Sep 17 00:00:00 2001 From: Zach Reizner Date: Wed, 28 Mar 2018 17:16:20 -0700 Subject: [PATCH] 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 Tested-by: Zach Reizner Reviewed-by: Stephen Barber Reviewed-by: Dylan Reid --- sys_util/src/poll.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys_util/src/poll.rs b/sys_util/src/poll.rs index 762c5e4009..d8ea45d877 100644 --- a/sys_util/src/poll.rs +++ b/sys_util/src/poll.rs @@ -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); } }