From d2a3a4c1f90bf0dfb534b27e6744e5126806f5e4 Mon Sep 17 00:00:00 2001 From: James Tirta Halim Date: Tue, 7 Jul 2026 12:25:37 +0700 Subject: [PATCH 1/3] cpu: reduce syscalls and avoid runtime fmt parsing --- src/cpu.cpp | 36 ++++++++++++++++++++++-------------- src/cpu.h | 2 +- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/cpu.cpp b/src/cpu.cpp index f46fabad1a..c30eb74294 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -108,9 +109,9 @@ CPUStats::CPUStats() CPUStats::~CPUStats() { - if (m_cpuTempFile) { - fclose(m_cpuTempFile); - m_cpuTempFile = nullptr; + if (m_cpuTempFd != -1) { + close(m_cpuTempFd); + m_cpuTempFd = -1; } } @@ -281,14 +282,23 @@ bool CPUStats::UpdateCoreMhz() { } bool CPUStats::ReadcpuTempFile(int& temp) { - if (!m_cpuTempFile) + if (m_cpuTempFd == -1) return false; - - rewind(m_cpuTempFile); - fflush(m_cpuTempFile); - bool ret = (fscanf(m_cpuTempFile, "%d", &temp) == 1); - temp = temp / 1000; - + int ret = -1; + char buf[21]; + /* lseek + read */ + ssize_t read_sz = pread(m_cpuTempFd, buf, sizeof(buf), 0); + /* valid temp */ + if (read_sz > 3) { + if (buf[read_sz] == '\n') /* sysfs guarantees newline? */ + --read_sz; + /* extract degrees */ + read_sz -= 3; + buf[read_sz] = '\0'; + char *buf_e; + temp = strtol(buf, &buf_e, 10); + ret = buf_e - buf; + } return ret; } @@ -559,7 +569,7 @@ static void check_thermal_zones(std::string& path, std::string& input) { } bool CPUStats::GetCpuFile() { - if (m_cpuTempFile) + if (m_cpuTempFd != -1) return true; std::string name, path, input; @@ -634,7 +644,7 @@ bool CPUStats::GetCpuFile() { } SPDLOG_INFO("hwmon: using input: {}", input); - m_cpuTempFile = fopen(input.c_str(), "r"); + m_cpuTempFd = open(input.c_str(), O_RDONLY); return true; } @@ -739,7 +749,6 @@ bool CPUStats::InitCpuPowerData() { return true; retries++; - std::string name, path; std::string hwmon = "/sys/class/hwmon/"; @@ -789,7 +798,6 @@ bool CPUStats::InitCpuPowerData() { } } } - if(cpuPowerData == nullptr) { SPDLOG_ERROR("Failed to initialize CPU power data"); return false; diff --git a/src/cpu.h b/src/cpu.h index d27c7887b0..5df520cc67 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -200,7 +200,7 @@ class CPUStats double m_cpuPeriod = 0; bool m_updatedCPUs = false; // TODO use caching or just update? bool m_inited = false; - FILE *m_cpuTempFile = nullptr; + int m_cpuTempFd = -1; std::unique_ptr m_cpuPowerData; const std::map intel_cores = { From 1c3e7844171c6d283c659b8fbd8364d4a1c0434e Mon Sep 17 00:00:00 2001 From: James Tirta Halim Date: Tue, 7 Jul 2026 12:59:32 +0700 Subject: [PATCH 2/3] strtol: add error handling --- src/cpu.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cpu.cpp b/src/cpu.cpp index c30eb74294..9de7949164 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -296,8 +296,11 @@ bool CPUStats::ReadcpuTempFile(int& temp) { read_sz -= 3; buf[read_sz] = '\0'; char *buf_e; - temp = strtol(buf, &buf_e, 10); - ret = buf_e - buf; + const long n = strtol(buf, &buf_e, 10); + if (n != LONG_MIN && n != LONG_MAX) { + temp = n; + ret = buf_e - buf; + } } return ret; } From b229f64d3b52d6b006ca2b49074044dcb7866ef1 Mon Sep 17 00:00:00 2001 From: James Tirta Halim Date: Tue, 7 Jul 2026 13:02:04 +0700 Subject: [PATCH 3/3] strtol: fix error handling --- src/cpu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpu.cpp b/src/cpu.cpp index 9de7949164..dbec8aa1cd 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -297,7 +297,7 @@ bool CPUStats::ReadcpuTempFile(int& temp) { buf[read_sz] = '\0'; char *buf_e; const long n = strtol(buf, &buf_e, 10); - if (n != LONG_MIN && n != LONG_MAX) { + if (n >= INT_MIN && n <= INT_MAX) { temp = n; ret = buf_e - buf; }