diff --git a/src/policy/lru.rs b/src/policy/lru.rs index 82f3461..f8097d6 100644 --- a/src/policy/lru.rs +++ b/src/policy/lru.rs @@ -228,7 +228,7 @@ //! }; //! use std::sync::Arc; //! -//! // Single-threaded usage +//! // Single-threaded usage (non-concurrent) //! let mut cache: LruCore = LruCore::new(100); //! cache.insert(1, Arc::new("page_data".to_string())); //! @@ -241,6 +241,17 @@ //! println!("Peeked: {}", value); // returns Arc //! } //! +//! // Multi-threaded usage with thread-safe wrapper +//! let cache: ConcurrentLruCache = ConcurrentLruCache::new(100); +//! +//! // Clone the handle and send to other threads; internal access is synchronized. +//! let cache_clone = cache.clone(); +//! cache_clone.insert(2, Arc::new("other_page".to_string())); +//! +//! if let Some(value) = cache_clone.get(&2) { +//! println!("Concurrent got: {}", value); // safe across threads +//! } +//! //! // Evict least recently used //! if let Some((key, value)) = cache.pop_lru() { //! println!("Evicted key={}, value={}", key, value); @@ -626,11 +637,11 @@ where #[inline] pub fn peek(&self, key: &K) -> Option> { #[cfg(feature = "metrics")] - (&self.metrics).record_peek_lru_call(); + self.metrics.record_peek_lru_call(); if let Some(&id) = self.map.get(key) { #[cfg(feature = "metrics")] - (&self.metrics).record_peek_lru_found(); + self.metrics.record_peek_lru_found(); let node = self.arena.get(id).expect("peek: stale SlotId"); return Some(Arc::clone(&node.value)); } @@ -680,13 +691,13 @@ where #[inline] fn peek_lru(&self) -> Option<(&K, &Arc)> { #[cfg(feature = "metrics")] - (&self.metrics).record_peek_lru_call(); + self.metrics.record_peek_lru_call(); let tail_id = self.tail?; let node = self.arena.get(tail_id)?; #[cfg(feature = "metrics")] - (&self.metrics).record_peek_lru_found(); + self.metrics.record_peek_lru_found(); Some((&node.key, &node.value)) } @@ -714,7 +725,7 @@ where fn recency_rank(&self, key: &K) -> Option { #[cfg(feature = "metrics")] - (&self.metrics).record_recency_rank_call(); + self.metrics.record_recency_rank_call(); let &target_id = self.map.get(key)?; let mut rank = 0usize; @@ -722,11 +733,11 @@ where while let Some(id) = current { #[cfg(feature = "metrics")] - (&self.metrics).record_recency_rank_scan_step(); + self.metrics.record_recency_rank_scan_step(); if id == target_id { #[cfg(feature = "metrics")] - (&self.metrics).record_recency_rank_found(); + self.metrics.record_recency_rank_found(); return Some(rank); } rank += 1;