27 lines
532 B
Rust
27 lines
532 B
Rust
use std::sync::{
|
|
Arc,
|
|
atomic::{AtomicU32, Ordering},
|
|
};
|
|
|
|
pub struct RefCounter(Arc<AtomicU32>);
|
|
|
|
impl RefCounter {
|
|
pub fn new() -> Self {
|
|
Self(Arc::new(0.into()))
|
|
}
|
|
pub fn refs(&self) -> u32 {
|
|
self.0.load(Ordering::Acquire)
|
|
}
|
|
pub fn drop(&mut self) -> bool {
|
|
let refs = self.0.fetch_sub(1, Ordering::Release);
|
|
refs == 0
|
|
}
|
|
}
|
|
|
|
impl Clone for RefCounter {
|
|
fn clone(&self) -> Self {
|
|
self.0.fetch_add(1, Ordering::Release);
|
|
Self(self.0.clone())
|
|
}
|
|
}
|