use qubit_lock::ArcMonitor;
#[derive(Clone)]
pub(crate) enum TaskAdmissionGate {
Open,
Blocked(ArcMonitor<bool>),
}
impl TaskAdmissionGate {
#[inline]
pub(crate) fn new(requires_ordering: bool) -> Self {
if requires_ordering {
Self::Blocked(ArcMonitor::new(false))
} else {
Self::Open
}
}
#[inline]
pub(crate) fn wait(&self) {
if let Self::Blocked(ready) = self {
ready.wait_until(|ready| *ready, |_ready| {});
}
}
#[inline]
pub(crate) fn open(&self) {
if let Self::Blocked(ready) = self {
ready.write(|ready| {
*ready = true;
});
ready.notify_one();
}
}
}