use core::sync::atomic::{AtomicUsize, Ordering::Relaxed};
pub(crate) static CHUNK_BYTES: Counter = Counter::new();
pub(crate) static HUGE_BYTES: Counter = Counter::new();
pub(crate) static HUGE_CACHED_BYTES: Counter = Counter::new();
pub(crate) static METADATA_BYTES: Counter = Counter::new();
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Stats {
pub chunks: usize,
pub huge: usize,
pub huge_cached: usize,
pub metadata: usize,
}
impl Stats {
#[must_use]
pub fn mapped(&self) -> usize {
self.chunks + self.huge + self.huge_cached + self.metadata
}
}
pub fn stats() -> Stats {
Stats {
chunks: CHUNK_BYTES.get(),
huge: HUGE_BYTES.get(),
huge_cached: HUGE_CACHED_BYTES.get(),
metadata: METADATA_BYTES.get(),
}
}
pub(crate) struct Counter(AtomicUsize);
impl Counter {
const fn new() -> Self {
Counter(AtomicUsize::new(0))
}
fn get(&self) -> usize {
self.0.load(Relaxed)
}
pub(crate) fn add(&self, n: usize) {
self.0.fetch_add(n, Relaxed);
}
pub(crate) fn sub(&self, n: usize) {
self.0.fetch_sub(n, Relaxed);
}
}