use tokio::sync::broadcast::{channel, error::RecvError, Sender};
#[derive(Debug, Clone, Copy)]
enum Empty {}
#[derive(Debug, Clone)]
pub(crate) struct Barrier {
inner: Sender<Empty>,
bypass: bool,
}
impl Barrier {
pub(crate) async fn wait(self) {
if self.bypass {
return;
}
let mut receiver = self.inner.subscribe();
drop(self.inner);
match receiver.recv().await {
Ok(_) => unreachable!(),
Err(RecvError::Lagged(_)) => unreachable!(),
Err(RecvError::Closed) => (),
}
}
pub(crate) fn new(bypass: bool) -> Self {
Self {
inner: channel(1).0,
bypass
}
}
}