From b2c1a32ec24bbb235e6b8f1b5e2fdfb5b025d4dd Mon Sep 17 00:00:00 2001 From: weriomat Date: Fri, 10 Jul 2026 20:13:43 +0200 Subject: [PATCH 1/2] Fix rapl subdomain only added once --- src/sensors/rapl.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/sensors/rapl.rs b/src/sensors/rapl.rs index 3de2bd3..f53bef1 100644 --- a/src/sensors/rapl.rs +++ b/src/sensors/rapl.rs @@ -1,5 +1,6 @@ use crate::model::sensor::{SensorCategory, SensorId, SensorReading, SensorUnit}; use crate::platform::sysfs::{self, CachedFile}; +use std::path::Path; use std::time::Instant; pub struct RaplSource { @@ -14,19 +15,35 @@ struct RaplDomain { prev_time: Instant, } +fn parse_domain(dir: &Path) -> Option { + Some( + dir.to_str()? + .chars() + .skip_while(|c| !c.is_ascii_digit()) + .take_while(|c| c.is_ascii_digit()) + .collect::(), + ) +} + impl RaplSource { pub fn discover() -> Self { let mut domains = Vec::new(); for dir in sysfs::glob_paths("/sys/class/powercap/intel-rapl:*") { - // Skip sub-domains like intel-rapl:0:1 at top level; we enumerate them - // separately via the glob which catches all levels. + // RAPL subdomains like intel-rapl:0:1 are included in the glob; + // in case the name of the subdomain does not have a distinctive number like `dram-0` a number will get added based on the RAPL domain. let name_path = dir.join("name"); - let name = match sysfs::read_string_optional(&name_path) { + let mut name = match sysfs::read_string_optional(&name_path) { Some(n) => n, None => continue, }; + if !name.chars().any(|c| c.is_ascii_digit()) + && let Some(rapl_domain) = parse_domain(&dir) + { + name = format!("{name}-{rapl_domain}"); + } + let energy_path = dir.join("energy_uj"); let max_path = dir.join("max_energy_range_uj"); From 864aff8e0fec146d54c03aa24423c0be3fbcc05e Mon Sep 17 00:00:00 2001 From: weriomat Date: Fri, 10 Jul 2026 20:54:40 +0200 Subject: [PATCH 2/2] Fix clippy lints in collectors and parsers --- src/collectors/cpu.rs | 8 ++++---- src/parsers/smbios.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/collectors/cpu.rs b/src/collectors/cpu.rs index 2bdf71e..b5c143f 100644 --- a/src/collectors/cpu.rs +++ b/src/collectors/cpu.rs @@ -111,13 +111,13 @@ struct CpuidData { fn gather_cpuid() -> Option { let cpuid = raw_cpuid::CpuId::new(); - let vendor = match cpuid.get_vendor_info() { - Some(v) => match v.as_str() { + let vendor = { + let v = cpuid.get_vendor_info()?; + match v.as_str() { "GenuineIntel" => CpuVendor::Intel, "AuthenticAMD" => CpuVendor::Amd, other => CpuVendor::Unknown(other.to_string()), - }, - None => return None, + } }; let brand = cpuid diff --git a/src/parsers/smbios.rs b/src/parsers/smbios.rs index 0b61a1c..4f71c61 100644 --- a/src/parsers/smbios.rs +++ b/src/parsers/smbios.rs @@ -291,7 +291,7 @@ fn read_u32_le(data: &[u8], offset: usize) -> Option { /// Read a non-zero u16 value; returns `None` for 0 or 0xFFFF (unknown). fn read_u16_nonzero(data: &[u8], offset: usize) -> Option { - read_u16_le(data, offset).and_then(|v| if v == 0 || v == 0xFFFF { None } else { Some(v) }) + read_u16_le(data, offset).filter(|&v| !(v == 0 || v == 0xFFFF)) } // ---------------------------------------------------------------------------