use std::io::{self, Write}; use std::thread; use std::time::{Duration, Instant}; mod cpu; mod gpu; mod mem; mod temp; fn parse_interval_ms() -> u64 { let args: Vec = std::env::args().collect(); let mut i = 1; while i < args.len() { if args[i] == "--interval" { if let Some(ms) = args.get(i + 1).and_then(|s| s.parse().ok()) { return ms; } } i += 1; } 1000 } fn main() { let interval = Duration::from_millis(parse_interval_ms()); let stdout = io::stdout(); let mut out = io::BufWriter::new(stdout.lock()); let mut prev: Vec = vec![]; let mut freqs: Vec = vec![]; let mut gpu = gpu::detect_gpu(); let mut tick = 0u64; loop { let t0 = Instant::now(); let curr = cpu::read_stat(); if tick.is_multiple_of(2) { freqs = cpu::read_core_freqs(); mem::emit_mem(&mut out); } cpu::emit_cpu(&mut out, &prev, &curr, &freqs); prev = curr; if tick.is_multiple_of(4) { temp::emit_temp(&mut out); // AMD/Intel read sysfs (instant); NVIDIA shells out so runs less often let emit = match &gpu { gpu::GpuBackend::Amd { .. } | gpu::GpuBackend::Intel { .. } => true, gpu::GpuBackend::Nvidia => tick.is_multiple_of(8), gpu::GpuBackend::None => false, }; if emit { gpu::emit_gpu(&mut out, &mut gpu); } } let _ = out.flush(); tick += 1; let elapsed = t0.elapsed(); if let Some(remaining) = interval.checked_sub(elapsed) { thread::sleep(remaining); } } }