forked from mirrors/gecko-dev
63 lines
1.2 KiB
Rust
63 lines
1.2 KiB
Rust
#![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<T> {
|
|
drop_count: Arc<AtomicUsize>,
|
|
value: Option<T>,
|
|
}
|
|
|
|
pub struct DropCounterHandle(Arc<AtomicUsize>);
|
|
|
|
impl<T> DropCounter<T> {
|
|
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<T> Drop for DropCounter<T> {
|
|
fn drop(&mut self) {
|
|
self.drop_count.fetch_add(1, SeqCst);
|
|
}
|
|
}
|