use std::sync::{ Arc, atomic::{AtomicUsize, Ordering}, }; #[derive(Debug, Clone, Default)] /// Counter for serving requests pub struct RequestCount(Arc); impl RequestCount { pub fn current(&self) -> usize { self.0.load(Ordering::Relaxed) } pub fn increment(&self) -> usize { self.0.fetch_add(1, Ordering::Relaxed) } pub fn decrement(&self) -> usize { let mut count; while { count = self.0.load(Ordering::Relaxed); count > 0 && self .0 .compare_exchange(count, count - 1, Ordering::Relaxed, Ordering::Relaxed) != Ok(count) } {} count } }