use std::sync::{
Arc,
atomic::{AtomicI64, Ordering},
};
use crate::{Timestamp, timestamp};
#[derive(Debug, Clone, Default)]
pub struct ServerClock {
offset_ms: Arc<AtomicI64>,
}
impl ServerClock {
pub fn new() -> Self {
Self::default()
}
pub fn offset(&self) -> i64 {
self.offset_ms.load(Ordering::Relaxed)
}
pub fn set_offset(&self, offset_ms: i64) {
self.offset_ms.store(offset_ms, Ordering::Relaxed);
}
pub fn now(&self) -> Timestamp {
timestamp().saturating_add_signed(self.offset())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn clones_share_the_offset() {
let clock = ServerClock::new();
let clone = clock.clone();
clone.set_offset(60_000);
assert_eq!(clock.offset(), 60_000);
let skew = clock.now() as i64 - (timestamp() as i64 + 60_000);
assert!(skew.abs() < 1000);
}
}