#![allow(dead_code)] extern crate alloc; #[cfg(not(loom))] use alloc::sync::Arc; #[cfg(not(loom))] use core::sync::atomic::{AtomicUsize, Ordering::SeqCst}; #[cfg(loom)] use loom::sync::{ atomic::{AtomicUsize, Ordering::SeqCst}, Arc, }; #[cfg(loom)] pub mod waker; pub fn maybe_loom_model(test: impl Fn() + Sync + Send + 'static) { #[cfg(loom)] loom::model(test); #[cfg(not(loom))] test(); } pub struct DropCounter { drop_count: Arc, value: Option, } pub struct DropCounterHandle(Arc); impl DropCounter { pub fn new(value: T) -> (Self, DropCounterHandle) { let drop_count = Arc::new(AtomicUsize::new(0)); ( Self { drop_count: drop_count.clone(), value: Some(value), }, DropCounterHandle(drop_count), ) } pub fn value(&self) -> &T { self.value.as_ref().unwrap() } pub fn into_value(mut self) -> T { self.value.take().unwrap() } } impl DropCounterHandle { pub fn count(&self) -> usize { self.0.load(SeqCst) } } impl Drop for DropCounter { fn drop(&mut self) { self.drop_count.fetch_add(1, SeqCst); } }