diff --git a/src/bin/main.c b/src/bin/main.c index 469428b..9f47af3 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -66,6 +66,13 @@ _test(int all) printf("Starting testing\n"); inf = system_info_all_get(); + int cpu_count = system_cpu_count_get(); + for (int i = 0; i < cpu_count; i++) + { + int temp = system_cpu_n_temperature_get(i); + if (temp != -1) printf(" cpu %d temp %d C\n", i, temp); + } + system_info_all_free(inf); if (!all) goto out; diff --git a/src/bin/system/machine.h b/src/bin/system/machine.h index d6a12f7..d87f7a9 100644 --- a/src/bin/system/machine.h +++ b/src/bin/system/machine.h @@ -104,6 +104,9 @@ system_cpu_frequency_get(void); int system_cpu_n_frequency_get(int n); +int +system_cpu_n_temperature_get(int n); + int system_cpu_frequency_min_max_get(int *min, int *max); diff --git a/src/bin/system/machine/cpu.bogox b/src/bin/system/machine/cpu.bogox index c9bb0db..1e1ebf8 100644 --- a/src/bin/system/machine/cpu.bogox +++ b/src/bin/system/machine/cpu.bogox @@ -279,6 +279,84 @@ system_cpu_usage_get(int *ncpu) return system_cpu_usage_delayed_get(ncpu, 1000000); } + +static char _core_temp[128][512]; +static char _hwmon_path[256]; + +int +_cpu_n_temperature_read(int n) +{ + int temp = -1; + + char *b = file_contents(_core_temp[n]); + if (b) + { + temp = atoi(b) / 1000; + free(b); + } + return temp; +} + +int +system_cpu_n_temperature_get(int n) +{ +#if defined(__linux__) + static int init = 0; + int cpu_count, i; + + if (!init) + { + char buf[4096]; + struct dirent *dh; + DIR *dir; + + memset(&_core_temp, 0, sizeof(_core_temp)); + memset(&_hwmon_path, 0, sizeof(_hwmon_path)); + + dir = opendir("/sys/class/hwmon"); + if (!dir) + { + init = 1; + return -1; + } + + while ((dh = readdir(dir)) != NULL) + { + if (dh->d_name[0] == '.') continue; + snprintf(buf, sizeof(buf), "/sys/class/hwmon/%s", dh->d_name); + char *link = realpath(buf, NULL); + if (!link) continue; + + snprintf(buf, sizeof(buf), "%s/name", link); + char *b = file_contents(buf); + if (b) + { + if (!strncmp(b, "coretemp", 8)) + snprintf(_hwmon_path, sizeof(_hwmon_path), "%s", link); + free(b); + } + free(link); + } + + closedir(dir); + init = 1; + } + + if (!_hwmon_path[0]) return -1; + + if (_core_temp[n][0]) + return _cpu_n_temperature_read(n); + + cpu_count = system_cpu_count_get(); + i = 1 + ((cpu_count + n) / 2) - (cpu_count / 2); + + snprintf(_core_temp[n], sizeof(_core_temp[n]), "%s/temp%d_input", _hwmon_path, i); + + return _cpu_n_temperature_read(n); +#endif + return -1; +} + int system_cpu_n_frequency_get(int n) {