use core::sync::atomic::{AtomicI64, AtomicU64, Ordering};
pub struct ProcessVmStat {
vss_pages: AtomicI64,
peak_vss_pages: AtomicU64,
peak_rss_pages: AtomicU64,
}
impl ProcessVmStat {
pub const fn new() -> Self {
Self {
vss_pages: AtomicI64::new(0),
peak_vss_pages: AtomicU64::new(0),
peak_rss_pages: AtomicU64::new(0),
}
}
#[inline]
pub fn vss_pages(&self) -> u64 {
self.vss_pages.load(Ordering::Relaxed).max(0) as u64
}
#[inline]
pub fn peak_vss_pages(&self) -> u64 {
self.peak_vss_pages.load(Ordering::Relaxed)
}
#[inline]
pub fn peak_rss_pages(&self) -> u64 {
self.peak_rss_pages.load(Ordering::Relaxed)
}
#[inline]
pub(super) fn on_map(&self, pages: u64) {
let new_vss = self
.vss_pages
.fetch_add(pages as i64, Ordering::Relaxed)
.max(0) as u64
+ pages;
self.peak_vss_pages.fetch_max(new_vss, Ordering::Relaxed);
self.peak_rss_pages.fetch_max(new_vss, Ordering::Relaxed);
}
#[inline]
pub(super) fn on_unmap(&self, pages: u64) {
self.vss_pages.fetch_sub(pages as i64, Ordering::Relaxed);
}
#[inline]
pub(super) fn on_clear(&self) {
self.vss_pages.store(0, Ordering::Relaxed);
self.peak_vss_pages.store(0, Ordering::Relaxed);
self.peak_rss_pages.store(0, Ordering::Relaxed);
}
#[inline]
pub(super) fn seed_from(&self, parent: &Self) {
let vss = parent.vss_pages();
self.vss_pages.store(vss as i64, Ordering::Relaxed);
self.peak_vss_pages
.store(parent.peak_vss_pages().max(vss), Ordering::Relaxed);
self.peak_rss_pages
.store(parent.peak_rss_pages().max(vss), Ordering::Relaxed);
}
}
impl Default for ProcessVmStat {
fn default() -> Self {
Self::new()
}
}