From f8f1e791a30a5b44a43a2d4bf673d837724c5396 Mon Sep 17 00:00:00 2001 From: jgmdev Date: Thu, 15 Apr 2021 14:30:29 -0400 Subject: [PATCH] [Module CPU] fix crash due to empty frequencies. On some systems (eg: ARM) the supported frequencies of the CPU are not properly reported by /proc/cpuinfo so if that fails try to retrieve them from /sys/devices/system/cpu/cpufreq/policy[0-9]/cpuinfo_[max|min]_freq. --- src/modules/cpu/linux.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/modules/cpu/linux.cpp b/src/modules/cpu/linux.cpp index b69f71a7..6d638a9f 100644 --- a/src/modules/cpu/linux.cpp +++ b/src/modules/cpu/linux.cpp @@ -1,3 +1,4 @@ +#include #include "modules/cpu.hpp" std::vector> waybar::modules::Cpu::parseCpuinfo() { @@ -46,5 +47,31 @@ std::vector waybar::modules::Cpu::parseCpuFrequencies() { frequencies.push_back(frequency); } info.close(); + + if (frequencies.size() <= 0) { + std::string cpufreq_dir = "/sys/devices/system/cpu/cpufreq"; + if (std::filesystem::exists(cpufreq_dir)) { + std::vector frequency_files = { + "/cpuinfo_min_freq", + "/cpuinfo_max_freq" + }; + for (auto& p: std::filesystem::directory_iterator(cpufreq_dir)) { + for (auto freq_file: frequency_files) { + std::string freq_file_path = p.path().string() + freq_file; + if (std::filesystem::exists(freq_file_path)) { + std::string freq_value; + std::ifstream freq(freq_file_path); + if (freq.is_open()) { + getline(freq, freq_value); + float frequency = std::strtol(freq_value.c_str(), nullptr, 10); + frequencies.push_back(frequency / 1000); + freq.close(); + } + } + } + } + } + } + return frequencies; }