Patch a few minor issues in fd_monitor

These differ from the C++ code and are being committed separately.
This commit is contained in:
Mahmoud Al-Qudsi 2023-02-18 12:40:20 -06:00
parent ce559bc20e
commit 8deaede6c7

View file

@ -188,8 +188,7 @@ impl FdMonitorItem {
} }
/// Invoke this item's callback with a poke, if its id is present in the sorted poke list. /// Invoke this item's callback with a poke, if its id is present in the sorted poke list.
// TODO: Rename to `maybe_poke_item()` to reflect its actual behavior. fn maybe_poke_item(&mut self, pokelist: &[FdMonitorItemId]) -> ItemAction {
fn poke_item(&mut self, pokelist: &[FdMonitorItemId]) -> ItemAction {
if self.item_id.0 == 0 || pokelist.binary_search(&self.item_id).is_err() { if self.item_id.0 == 0 || pokelist.binary_search(&self.item_id).is_err() {
// Not pokeable or not in the poke list. // Not pokeable or not in the poke list.
return ItemAction::Retain; return ItemAction::Retain;
@ -379,14 +378,10 @@ impl FdMonitor {
let needs_notification = { let needs_notification = {
let mut data = self.data.lock().expect("Mutex poisoned!"); let mut data = self.data.lock().expect("Mutex poisoned!");
let needs_notification = data.pokelist.is_empty(); let needs_notification = data.pokelist.is_empty();
// Insert it, sorted. // Insert it, sorted. But not if it already exists.
// TODO: The C++ code inserts it even if it's already in the poke list. That seems if let Err(pos) = data.pokelist.binary_search(&item_id) {
// unnecessary? data.pokelist.insert(pos, item_id);
let pos = match data.pokelist.binary_search(&item_id) {
Ok(pos) => pos,
Err(pos) => pos,
}; };
data.pokelist.insert(pos, item_id);
needs_notification needs_notification
}; };
@ -491,9 +486,6 @@ impl BackgroundFdMonitor {
// Service all items that are either readable or have timed out, and remove any which // Service all items that are either readable or have timed out, and remove any which
// say to do so. // say to do so.
// This line is from the C++ codebase (fd_monitor.cpp:170) but this write is never read.
// now = Instant::now();
self.items self.items
.retain_mut(|item| servicer(item) == ItemAction::Retain); .retain_mut(|item| servicer(item) == ItemAction::Retain);
@ -540,7 +532,7 @@ impl BackgroundFdMonitor {
/// poke list is consumed after this. This is only called from the background thread. /// poke list is consumed after this. This is only called from the background thread.
fn poke(&mut self, pokelist: &[FdMonitorItemId]) { fn poke(&mut self, pokelist: &[FdMonitorItemId]) {
self.items.retain_mut(|item| { self.items.retain_mut(|item| {
let action = item.poke_item(&*pokelist); let action = item.maybe_poke_item(&*pokelist);
if action == ItemAction::Remove { if action == ItemAction::Remove {
FLOG!(fd_monitor, "Removing fd", item.fd.as_raw_fd()); FLOG!(fd_monitor, "Removing fd", item.fd.as_raw_fd());
} }