extern crate std;
use std::cell::RefCell;
use std::sync::mpsc::{Receiver, SyncSender};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(super) enum Point {
InGuardBeforeClaim,
AfterLanding,
ResizerMetHeldGuard,
WriterMetHeldGuard,
LookupReadHops,
HeldScanLoaded,
MoveLinkedTwice,
MoveUnlinked,
ComputeReserved,
}
pub(super) struct Stop {
pub(super) point: Point,
pub(super) arrived: SyncSender<()>,
pub(super) go: Receiver<()>,
}
std::thread_local! {
static ARMED: RefCell<Option<Stop>> = const { RefCell::new(None) };
}
pub(super) fn arm(stop: Stop) {
ARMED.with(|armed| *armed.borrow_mut() = Some(stop));
}
pub(super) fn at(point: Point) {
let stop = ARMED.with(|armed| {
let mut armed = armed.borrow_mut();
if armed.as_ref().is_some_and(|stop| stop.point == point) {
armed.take()
} else {
None
}
});
if let Some(stop) = stop {
if stop.arrived.send(()).is_ok() {
let _ = stop.go.recv();
}
}
}