use std::sync::atomic::{AtomicU64, Ordering};
use super::{phys_now_ms, SenderCounter, Seq, Stamp};
impl Default for SenderCounter {
fn default() -> Self {
SenderCounter::new()
}
}
impl SenderCounter {
pub fn new() -> Self {
SenderCounter {
seq: AtomicU64::new(Seq::FIRST.0),
stamp_floor: AtomicU64::new(0),
}
}
pub fn next_seq(&self) -> Seq {
Seq(self.seq.fetch_add(1, Ordering::Relaxed))
}
pub fn next_stamp(&self) -> Stamp {
self.next_stamp_at(phys_now_ms())
}
pub fn next_stamp_at(&self, now_ms: u64) -> Stamp {
let prev = self.stamp_floor.fetch_max(now_ms, Ordering::Relaxed);
Stamp(prev.max(now_ms))
}
}