use once_cell::sync::Lazy;
use std::sync::atomic::{AtomicU64, Ordering};
static GLOBAL_SEQNO: Lazy<AtomicU64> = Lazy::new(|| AtomicU64::new(0));
pub fn allocate() -> u64 {
let prev = GLOBAL_SEQNO.fetch_add(1, Ordering::SeqCst);
prev + 1
}
pub fn current() -> u64 {
GLOBAL_SEQNO.load(Ordering::SeqCst)
}
pub fn advance_to(min: u64) -> u64 {
let cur = GLOBAL_SEQNO.load(Ordering::SeqCst);
if cur >= min {
return cur;
}
let _ = GLOBAL_SEQNO.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |old| {
if old >= min {
None
} else {
Some(min)
}
});
GLOBAL_SEQNO.load(Ordering::SeqCst)
}
#[cfg(test)]
mod tests;