add a few useful methods to AtomicInterval (#20152)

This commit is contained in:
Jeff Washington (jwash) 2021-09-24 10:27:23 -05:00 committed by GitHub
parent 9653f6b28d
commit 88fd9670df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 0 deletions

View File

@ -80,6 +80,18 @@ impl AtomicInterval {
== Ok(last)
&& !(skip_first && last == 0)
}
/// return ms elapsed since the last time the time was set
pub fn elapsed_ms(&self) -> u64 {
let now = timestamp();
let last = self.last_update.load(Ordering::Relaxed);
now.saturating_sub(last) // wrapping somehow?
}
/// return ms until the interval_time will have elapsed
pub fn remaining_until_next_interval(&self, interval_time: u64) -> u64 {
interval_time.saturating_sub(self.elapsed_ms())
}
}
#[cfg(test)]
@ -96,6 +108,11 @@ mod test {
assert!(i.should_update_ext(1000, false));
std::thread::sleep(Duration::from_millis(10));
assert!(i.elapsed_ms() > 9 && i.elapsed_ms() < 1000);
assert!(
i.remaining_until_next_interval(1000) > 9
&& i.remaining_until_next_interval(1000) < 991
);
assert!(i.should_update(9));
assert!(!i.should_update(100));
}