use crate::memory::{make_map, VirtualMemory};
use crate::{read_file, Error, Result};
const PROC_MEMINFO: &str = "/proc/meminfo";
pub fn virtual_memory() -> Result<VirtualMemory> {
let contents = read_file(PROC_MEMINFO)?;
let meminfo = make_map(&contents, PROC_MEMINFO)?;
let get = |key: &str| -> Result<u64> {
meminfo.get(key).copied().ok_or(Error::MissingData {
path: PROC_MEMINFO.into(),
contents: contents.clone(),
})
};
let total = get("MemTotal")?;
let available = get("MemAvailable")?;
let free = get("MemFree")?;
let active = get("Active")?;
let inactive = get("Inactive")?;
let buffers = get("Buffers")?;
let cached = get("Cached")? + get("SReclaimable")?;
let shared = get("Shmem")?;
let slab = 0;
let used = total - free - cached - buffers;
let percent = (((total as f64 - available as f64) / total as f64) * 100.0) as f32;
Ok(VirtualMemory {
total,
available,
used,
free,
percent,
active,
inactive,
buffers,
cached,
shared,
slab,
})
}