From 2498cac7261c08b3bfd91eb468d1a88052043d93 Mon Sep 17 00:00:00 2001 From: ihtefyw Date: Tue, 14 Oct 2025 15:42:46 +0200 Subject: [PATCH] Fix undetected unpinned element in advance_hot --- src/shard.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/shard.rs b/src/shard.rs index 52a2546..ca7e38e 100644 --- a/src/shard.rs +++ b/src/shard.rs @@ -1,4 +1,5 @@ use std::{ + collections::HashSet, hash::{BuildHasher, Hash}, hint::unreachable_unchecked, mem::{self, MaybeUninit}, @@ -9,7 +10,7 @@ use hashbrown::HashTable; use crate::{ linked_slab::{LinkedSlab, Token}, shim::sync::atomic::{self, AtomicU16}, - Equivalent, Lifecycle, MemoryUsed, Weighter, + DefaultHashBuilder, Equivalent, Lifecycle, MemoryUsed, Weighter, }; #[cfg(feature = "stats")] @@ -724,7 +725,7 @@ impl< /// Advance hot ring evicting entries. #[must_use] fn advance_hot(&mut self, lcs: &mut L::RequestState) -> bool { - let mut unpinned = 0usize; + let mut unpinned: HashSet<_, DefaultHashBuilder> = HashSet::default(); let Some(mut idx) = self.hot_head else { return false; }; @@ -738,13 +739,14 @@ impl< *resident.referenced.get_mut() = (*resident.referenced.get_mut()) .min(MAX_F) .saturating_sub(1); - if unpinned == 0 && Some(next) == self.hot_head { + unpinned.remove(&idx); + if unpinned.is_empty() && Some(next) == self.hot_head { return false; } idx = next; continue; } - unpinned += 1; + unpinned.insert(idx); if *resident.referenced.get_mut() != 0 { *resident.referenced.get_mut() = (*resident.referenced.get_mut()).min(MAX_F) - 1; idx = next;