use std::sync::atomic::{AtomicU32, AtomicU64, Ordering};
#[derive(Copy, Clone, Debug, Default)]
pub struct ProcessSnapshot {
pub memory_bytes: u64,
pub cpu_percent: f32,
}
static SYNC_MEMORY_BYTES: AtomicU64 = AtomicU64::new(0);
static SYNC_CPU_PERCENT_BITS: AtomicU32 = AtomicU32::new(0);
pub fn process_snapshot() -> ProcessSnapshot {
ProcessSnapshot {
memory_bytes: SYNC_MEMORY_BYTES.load(Ordering::Relaxed),
cpu_percent: f32::from_bits(SYNC_CPU_PERCENT_BITS.load(Ordering::Relaxed)),
}
}
pub async fn refresh_process_snapshot() -> ProcessSnapshot {
crate::sys::refresh().await;
let info = crate::sys::INFORMATION.lock().await;
let snapshot = ProcessSnapshot {
memory_bytes: info.memory_usage,
cpu_percent: info.cpu_usage,
};
SYNC_MEMORY_BYTES.store(snapshot.memory_bytes, Ordering::Relaxed);
SYNC_CPU_PERCENT_BITS.store(snapshot.cpu_percent.to_bits(), Ordering::Relaxed);
snapshot
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn refresh_populates_sync_snapshot_cache() {
let cold = process_snapshot();
let refreshed = refresh_process_snapshot().await;
assert!(refreshed.memory_bytes > 0, "sysinfo failed to read RSS");
let after = process_snapshot();
assert_eq!(
after.memory_bytes, refreshed.memory_bytes,
"sync cache did not pick up the async refresh result",
);
assert!(after.memory_bytes >= cold.memory_bytes);
}
}