use std::{
sync::{
atomic::{AtomicBool, AtomicUsize, Ordering},
Arc,
},
time::Instant,
};
pub(crate) struct AtomicCounter(AtomicUsize, Instant, Arc<AtomicBool>, usize);
impl Drop for AtomicCounter {
fn drop(&mut self) {
self.2.store(true, Ordering::Relaxed);
assert_eq!(self.0.load(Ordering::Relaxed), self.3);
}
}
impl AtomicCounter {
pub(crate) fn new(correct_count: usize) -> Self {
let now = Instant::now();
AtomicCounter(AtomicUsize::new(0), now, Arc::new(AtomicBool::new(false)), correct_count)
}
pub(crate) fn fetch_add(&self, val: usize) -> usize {
self.0.fetch_add(val, Ordering::Relaxed)
}
pub(crate) fn get_state(&self) -> Arc<AtomicBool> {
self.2.clone()
}
}