From c55320e9e2a8916e911bcd39ab37b79e3a7d03b2 Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Mon, 11 Jan 2021 20:43:27 +0100 Subject: New upstream version 3.0.5 --- linux/LibSensors.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 8 deletions(-) (limited to 'linux/LibSensors.c') diff --git a/linux/LibSensors.c b/linux/LibSensors.c index a30e21b..158829a 100644 --- a/linux/LibSensors.c +++ b/linux/LibSensors.c @@ -4,6 +4,7 @@ #include #include +#include #include #include "XUtils.h" @@ -16,12 +17,19 @@ static int (*sym_sensors_snprintf_chip_name)(char*, size_t, const sensors_chip_n static const sensors_feature* (*sym_sensors_get_features)(const sensors_chip_name*, int*); static const sensors_subfeature* (*sym_sensors_get_subfeature)(const sensors_chip_name*, const sensors_feature*, sensors_subfeature_type); static int (*sym_sensors_get_value)(const sensors_chip_name*, int, double*); +static char* (*sym_sensors_get_label)(const sensors_chip_name*, const sensors_feature*); static void* dlopenHandle = NULL; int LibSensors_init(FILE* input) { if (!dlopenHandle) { + /* Find the unversioned libsensors.so (symlink) and prefer that, but Debian has .so.5 and Fedora .so.4 without + matching symlinks (unless people install the -dev packages) */ dlopenHandle = dlopen("libsensors.so", RTLD_LAZY); + if (!dlopenHandle) + dlopenHandle = dlopen("libsensors.so.5", RTLD_LAZY); + if (!dlopenHandle) + dlopenHandle = dlopen("libsensors.so.4", RTLD_LAZY); if (!dlopenHandle) goto dlfailure; @@ -41,6 +49,7 @@ int LibSensors_init(FILE* input) { resolve(sensors_get_features); resolve(sensors_get_subfeature); resolve(sensors_get_value); + resolve(sensors_get_label); #undef resolve } @@ -64,17 +73,23 @@ void LibSensors_cleanup(void) { } } -int LibSensors_getCPUTemperatures(CPUData* cpus, int cpuCount) { +void LibSensors_getCPUTemperatures(CPUData* cpus, unsigned int cpuCount) { + for (unsigned int i = 0; i <= cpuCount; i++) + cpus[i].temperature = NAN; + if (!dlopenHandle) - return -ENOTSUP; + return; - int tempCount = 0; + unsigned int coreTempCount = 0; int n = 0; for (const sensors_chip_name *chip = sym_sensors_get_detected_chips(NULL, &n); chip; chip = sym_sensors_get_detected_chips(NULL, &n)) { char buffer[32]; sym_sensors_snprintf_chip_name(buffer, sizeof(buffer), chip); - if (!String_startsWith(buffer, "coretemp") && !String_startsWith(buffer, "cpu_thermal")) + if (!String_startsWith(buffer, "coretemp") && + !String_startsWith(buffer, "cpu_thermal") && + !String_startsWith(buffer, "k10temp") && + !String_startsWith(buffer, "zenpower")) continue; int m = 0; @@ -82,7 +97,27 @@ int LibSensors_getCPUTemperatures(CPUData* cpus, int cpuCount) { if (feature->type != SENSORS_FEATURE_TEMP) continue; - if (feature->number > cpuCount) + char* label = sym_sensors_get_label(chip, feature); + if (!label) + continue; + + unsigned int tempId; + if (String_startsWith(label, "Package ")) { + tempId = 0; + } else if (String_startsWith(label, "temp")) { + /* Raspberry Pi has only temp1 */ + tempId = 0; + } else if (String_startsWith(label, "Tdie")) { + tempId = 0; + } else if (String_startsWith(label, "Core ")) { + tempId = 1 + atoi(label + strlen("Core ")); + } else { + tempId = UINT_MAX; + } + + free(label); + + if (tempId > cpuCount) continue; const sensors_subfeature *sub_feature = sym_sensors_get_subfeature(chip, feature, SENSORS_SUBFEATURE_TEMP_INPUT); @@ -92,13 +127,43 @@ int LibSensors_getCPUTemperatures(CPUData* cpus, int cpuCount) { if (r != 0) continue; - cpus[feature->number].temperature = temp; - tempCount++; + cpus[tempId].temperature = temp; + if (tempId > 0) + coreTempCount++; } } } - return tempCount; + const double packageTemp = cpus[0].temperature; + + /* Only package temperature - copy to all cpus */ + if (coreTempCount == 0 && !isnan(packageTemp)) { + for (unsigned int i = 1; i <= cpuCount; i++) + cpus[i].temperature = packageTemp; + + return; + } + + /* No package temperature - set to max core temperature */ + if (isnan(packageTemp) && coreTempCount != 0) { + double maxTemp = NAN; + for (unsigned int i = 1; i <= cpuCount; i++) { + const double coreTemp = cpus[i].temperature; + if (isnan(coreTemp)) + continue; + + maxTemp = MAXIMUM(maxTemp, coreTemp); + } + + cpus[0].temperature = maxTemp; + } + + /* Half the temperatures, probably HT/SMT - copy to second half */ + const unsigned int delta = cpuCount / 2; + if (coreTempCount == delta) { + for (unsigned int i = 1; i <= delta; i++) + cpus[i + delta].temperature = cpus[i].temperature; + } } #endif /* HAVE_SENSORS_SENSORS_H */ -- cgit v1.2.3