mod tests;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::mpsc;
use std::sync::Mutex;
pub struct CountDownLatch {
remaining: AtomicUsize,
tx: mpsc::SyncSender<()>,
rx: Mutex<mpsc::Receiver<()>>,
}
impl CountDownLatch {
pub fn new(count: usize) -> Self {
let (tx, rx) = mpsc::sync_channel(count);
Self {
remaining: AtomicUsize::new(count),
tx: tx,
rx: Mutex::new(rx),
}
}
pub fn count_down(&self) {
self.tx.send(()).unwrap();
}
pub fn get_count(&self) -> usize {
let lock = self.rx.try_lock();
if let Ok(rx) = lock {
while self.remaining.load(Ordering::SeqCst) > 0 && rx.try_recv().is_ok() {
self.remaining.fetch_sub(1, Ordering::SeqCst);
}
}
return self.remaining.load(Ordering::SeqCst);
}
pub fn await(&self) {
let rx = self.rx.lock().unwrap();
while self.remaining.load(Ordering::SeqCst) > 0 {
rx.recv().unwrap();
self.remaining.fetch_sub(1, Ordering::SeqCst);
}
}
}