use std::num::NonZeroU64;
use crate::collection::{DataCollector, memory::MemData};
#[inline]
fn get_usage(used: u64, total: u64) -> Option<MemData> {
NonZeroU64::new(total).map(|total_bytes| MemData {
total_bytes,
used_bytes: used,
})
}
pub(crate) fn get_ram_usage(collector: &DataCollector) -> Option<MemData> {
let sys = &collector.sys.system;
cfg_if::cfg_if! {
if #[cfg(target_os = "linux")] {
use crate::collection::linux::cgroups;
let base_used = sys.used_memory();
let base_total = sys.total_memory();
let (used, total) = match &collector.cgroup_memory_data.ram {
Some(cgroup_data) => {
let used = cgroup_data.used_bytes;
let total = match cgroup_data.limit {
Some(cgroups::CgroupMemLimit::Bytes(bytes)) => bytes,
Some(cgroups::CgroupMemLimit::Max) => base_total,
None => base_total,
};
(used, total)
}
None => (base_used, base_total),
};
get_usage(used, total)
} else {
get_usage(sys.used_memory(), sys.total_memory())
}
}
}
#[cfg(not(target_os = "windows"))]
pub(crate) fn get_swap_usage(collector: &DataCollector) -> Option<MemData> {
let sys = &collector.sys.system;
cfg_if::cfg_if! {
if #[cfg(target_os = "linux")] {
use crate::collection::linux::cgroups;
let base_used = sys.used_swap();
let base_total = sys.total_swap();
let (used, total) = match &collector.cgroup_memory_data.swap {
Some(cgroup_data) => {
let used = cgroup_data.used_bytes;
let total = match cgroup_data.limit {
Some(cgroups::CgroupMemLimit::Bytes(bytes)) => bytes,
Some(cgroups::CgroupMemLimit::Max) => base_total,
None => base_total,
};
(used, total)
}
None => (base_used, base_total),
};
get_usage(used, total)
} else {
get_usage(sys.used_swap(), sys.total_swap())
}
}
}
#[cfg(not(target_os = "windows"))]
pub(crate) fn get_cache_usage(sys: &sysinfo::System) -> Option<MemData> {
let mem_used = sys.available_memory().saturating_sub(sys.free_memory());
let mem_total = sys.total_memory();
get_usage(mem_used, mem_total)
}