#[must_use]
pub fn detect_total_memory() -> usize {
let mut system = sysinfo::System::new();
system.refresh_memory();
let physical = system.total_memory();
let bytes = system.cgroup_limits().map_or(physical, |c| c.total_memory.min(physical));
usize::try_from(bytes).unwrap_or(usize::MAX)
}
#[must_use]
pub fn detect_cpu_count() -> usize {
num_cpus::get().max(1)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_detect_total_memory_nonzero() {
let total = detect_total_memory();
assert!(total > 0, "expected non-zero total memory, got {total}");
}
#[test]
fn test_detect_total_memory_bounded_by_physical() {
let total = detect_total_memory();
let mut system = sysinfo::System::new();
system.refresh_memory();
let physical = usize::try_from(system.total_memory()).unwrap_or(usize::MAX);
assert!(total <= physical, "cgroup-limited total {total} exceeded physical {physical}");
}
#[test]
fn test_detect_cpu_count_at_least_one() {
assert!(detect_cpu_count() >= 1);
}
#[test]
fn test_detect_cpu_count_reasonable() {
assert!(detect_cpu_count() <= 65536);
}
}