oxur_repl/eval/
stats.rs

1//! Resource statistics for REPL evaluation
2//!
3//! Provides process-level resource statistics (memory, PID).
4//! Evaluation metrics (timing, cache) are now in `crate::metrics::EvalMetrics`.
5
6use sysinfo::{Pid, ProcessRefreshKind, RefreshKind, System};
7
8/// Resource usage statistics
9#[derive(Debug, Clone)]
10pub struct ResourceStats {
11    /// Process memory (RSS - Resident Set Size) in bytes
12    pub process_memory_bytes: u64,
13
14    /// Virtual memory size in bytes
15    pub virtual_memory_bytes: u64,
16
17    /// Process ID
18    pub pid: u32,
19}
20
21/// Get current process resource usage
22pub fn get_resource_stats() -> Option<ResourceStats> {
23    let pid = std::process::id();
24    let mut system = System::new_with_specifics(
25        RefreshKind::new().with_processes(ProcessRefreshKind::new().with_memory()),
26    );
27
28    system.refresh_processes_specifics(ProcessRefreshKind::new().with_memory());
29
30    let sysinfo_pid = Pid::from_u32(pid);
31    let process = system.process(sysinfo_pid)?;
32
33    Some(ResourceStats {
34        process_memory_bytes: process.memory(),
35        virtual_memory_bytes: process.virtual_memory(),
36        pid,
37    })
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_get_resource_stats() {
46        // This test may fail in some CI environments without process info access
47        let stats = get_resource_stats();
48        if let Some(stats) = stats {
49            assert!(stats.pid > 0);
50            // Memory values should be non-zero for running process
51            assert!(stats.process_memory_bytes > 0 || stats.virtual_memory_bytes > 0);
52        }
53    }
54}