use std::sync::atomic::{AtomicU64, Ordering};
pub struct BridgeMetrics {
push_count: AtomicU64,
pop_count: AtomicU64,
full_count: AtomicU64,
}
impl BridgeMetrics {
pub(crate) fn new() -> Self {
Self {
push_count: AtomicU64::new(0),
pop_count: AtomicU64::new(0),
full_count: AtomicU64::new(0),
}
}
pub(crate) fn record_push(&self) {
self.push_count.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_pop(&self) {
self.pop_count.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_pops(&self, n: u64) {
self.pop_count.fetch_add(n, Ordering::Relaxed);
}
pub(crate) fn record_full(&self) {
self.full_count.fetch_add(1, Ordering::Relaxed);
}
pub fn pushes(&self) -> u64 {
self.push_count.load(Ordering::Relaxed)
}
pub fn pops(&self) -> u64 {
self.pop_count.load(Ordering::Relaxed)
}
pub fn full_events(&self) -> u64 {
self.full_count.load(Ordering::Relaxed)
}
pub fn in_flight(&self) -> u64 {
let pushed = self.pushes();
let popped = self.pops();
pushed.saturating_sub(popped)
}
}