use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Mutex, MutexGuard};
static CHECKOUT_SPOOL_PROBE: AtomicUsize = AtomicUsize::new(0); static CHECKOUT_SPOOL_PROBE_ACTIVE: AtomicUsize = AtomicUsize::new(0); static CHECKOUT_SPOOL_PROBE_SERIAL: Mutex<bool> = Mutex::new(false);
pub struct CheckoutSpoolProbeScope {
_serial: MutexGuard<'static, bool>,
}
impl Drop for CheckoutSpoolProbeScope {
fn drop(&mut self) {
*self._serial = false;
CHECKOUT_SPOOL_PROBE_ACTIVE.store(0, Ordering::Release);
}
}
pub fn reset_checkout_spool_probe() -> CheckoutSpoolProbeScope {
let mut serial = CHECKOUT_SPOOL_PROBE_SERIAL
.lock()
.unwrap_or_else(|e| e.into_inner());
assert!(
!*serial,
"checkout spool probe already armed in another test"
);
*serial = true;
CHECKOUT_SPOOL_PROBE.store(0, Ordering::Relaxed);
CHECKOUT_SPOOL_PROBE_ACTIVE.store(1, Ordering::Release);
CheckoutSpoolProbeScope { _serial: serial }
}
pub fn checkout_spool_probe_count() -> usize {
CHECKOUT_SPOOL_PROBE.load(Ordering::Relaxed)
}
pub(crate) fn record_spool_delete() {
if CHECKOUT_SPOOL_PROBE_ACTIVE.load(Ordering::Acquire) != 0 {
CHECKOUT_SPOOL_PROBE.fetch_add(1, Ordering::Relaxed);
}
}