use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct MemorySnapshot {
pub rss_kb: Option<u64>,
pub peak_rss_kb: Option<u64>,
pub vsize_kb: Option<u64>,
pub peak_vsize_kb: Option<u64>,
pub threads: Option<u64>,
}
impl MemorySnapshot {
pub fn capture() -> Self {
#[cfg(target_os = "linux")]
{
match std::fs::read_to_string("/proc/self/status") {
Ok(text) => Self::parse(&text),
Err(_) => Self::default(),
}
}
#[cfg(not(target_os = "linux"))]
{
Self::default()
}
}
pub fn parse(text: &str) -> Self {
let mut s = Self::default();
for line in text.lines() {
let (key, rest) = match line.split_once(':') {
Some((k, v)) => (k.trim(), v.trim()),
None => continue,
};
let num = rest
.split_whitespace()
.next()
.and_then(|n| n.parse::<u64>().ok());
match key {
"VmRSS" => s.rss_kb = num,
"VmHWM" => s.peak_rss_kb = num,
"VmSize" => s.vsize_kb = num,
"VmPeak" => s.peak_vsize_kb = num,
"Threads" => s.threads = num,
_ => {}
}
}
s
}
pub fn rss_mib(&self) -> Option<u64> {
self.rss_kb.map(|kb| kb / 1024)
}
}