From 29eee9d1bcbe031814616946145fc51617f91297 Mon Sep 17 00:00:00 2001 From: malik672 Date: Wed, 24 Jun 2026 14:23:20 +0100 Subject: [PATCH] perf: Optimize Cache::remove for value types that need drop --- src/lib.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 410ea17..5e18e0e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -366,18 +366,21 @@ where let data = unsafe { &mut *bucket.data.get() }; let (ck, v) = unsafe { data.assume_init_ref() }; if key.equivalent(ck) { - let v = v.clone(); #[cfg(feature = "stats")] if C::STATS && let Some(stats) = &self.stats { - stats.record_remove(ck, &v); + stats.record_remove(ck, v); } - if Self::NEEDS_DROP { - // SAFETY: We hold the lock, so we have exclusive access. - unsafe { data.assume_init_drop() }; + if !Self::NEEDS_DROP { + let v = v.clone(); + bucket.unlock(0); + return Some(v); } + // SAFETY: We hold the lock, so we have exclusive access. + let (k, v) = unsafe { data.assume_init_read() }; bucket.unlock(0); + drop(k); return Some(v); } bucket.unlock(tag);