use std::sync::atomic::{AtomicUsize, Ordering};
#[derive(Debug, Default)]
pub struct ReqStats {
bytes_tx: AtomicUsize,
bytes_rx: AtomicUsize,
rtt: AtomicUsize,
rtt_idx: AtomicUsize,
}
impl ReqStats {
#[inline]
pub(crate) fn update_rtt(&self, rtt_us: usize) {
let idx = self.rtt_idx.fetch_add(1, Ordering::Relaxed);
let prev = self.rtt.load(Ordering::Relaxed);
let new = (rtt_us + idx * prev) / (idx + 1);
self.rtt.store(new, Ordering::Relaxed);
}
#[inline]
pub(crate) fn increment_tx(&self, bytes: usize) {
self.bytes_tx.fetch_add(bytes, Ordering::Relaxed);
}
#[inline]
pub(crate) fn increment_rx(&self, bytes: usize) {
self.bytes_rx.fetch_add(bytes, Ordering::Relaxed);
}
#[inline]
pub fn rtt(&self) -> usize {
self.rtt.load(Ordering::Relaxed)
}
#[inline]
pub fn bytes_tx(&self) -> usize {
self.bytes_tx.load(Ordering::Relaxed)
}
#[inline]
pub fn bytes_rx(&self) -> usize {
self.bytes_rx.load(Ordering::Relaxed)
}
}