diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index 47eaf6dc4..1b2bf28d6 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -67,9 +67,9 @@ static double getFrequency(const char* info, const char* scaling) return getGHz(scaling); } -static double detectCPUTemp(const FFinstance* instance) +static double detectCPUTemp() { - const FFTempsResult* temps = ffDetectTemps(instance); + const FFTempsResult* temps = ffDetectTemps(); for(uint32_t i = 0; i < temps->values.length; i++) { diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index 21e71668f..d34807df9 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -146,20 +146,16 @@ static void pciDetectDriverName(FFGPUResult* gpu, PCIData* pci, struct pci_dev* ffStrbufDestroy(&path); } -static void pciDetectTemperatur(const FFinstance* instance, FFGPUResult* gpu, struct pci_dev* device) +static void pciDetectTemperatur(FFGPUResult* gpu, struct pci_dev* device) { - const FFTempsResult* tempsResult = ffDetectTemps(instance); + const FFTempsResult* tempsResult = ffDetectTemps(); for(uint32_t i = 0; i < tempsResult->values.length; i++) { FFTempValue* tempValue = ffListGet(&tempsResult->values, i); - uint32_t tempClass; - if(sscanf(tempValue->deviceClass.chars, "%x", &tempClass) != 1) - continue; - //The kernel exposes the device class multiplied by 256 for some reason - if(tempClass == device->device_class * 256) + if(tempValue->deviceClass == device->device_class * 256) { gpu->temperature = tempValue->value; return; @@ -233,7 +229,7 @@ static void pciHandleDevice(const FFinstance* instance, FFlist* results, PCIData gpu->temperature = FF_GPU_TEMP_UNSET; if(instance->config.gpuTemp) - pciDetectTemperatur(instance, gpu, device); + pciDetectTemperatur(gpu, device); } static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus) diff --git a/src/detection/temps/temps_linux.c b/src/detection/temps/temps_linux.c index cb342a9f8..5a1dc2bd4 100644 --- a/src/detection/temps/temps_linux.c +++ b/src/detection/temps/temps_linux.c @@ -8,18 +8,19 @@ static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value) { + //https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface uint32_t dirLength = dir->length; - FFstrbuf valueBuffer; + FF_STRBUF_AUTO_DESTROY valueBuffer; ffStrbufInit(&valueBuffer); ffStrbufAppendS(dir, "temp1_input"); - ffReadFileBuffer(dir->chars, &valueBuffer); + if(!ffReadFileBuffer(dir->chars, &valueBuffer)) + return false; + ffStrbufSubstrBefore(dir, dirLength); - value->value = ffStrbufToDouble(&valueBuffer); - - ffStrbufDestroy(&valueBuffer); + value->value = ffStrbufToDouble(&valueBuffer) / 1000; // valueBuffer is millidegree Celsius if(value->value != value->value) return false; @@ -28,14 +29,16 @@ static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value) ffReadFileBuffer(dir->chars, &value->name); ffStrbufSubstrBefore(dir, dirLength); - ffStrbufAppendS(dir, "device/class"); - ffReadFileBuffer(dir->chars, &value->deviceClass); + ffStrbufAppendS(dir, "device/device/class"); + + if(ffReadFileBuffer(dir->chars, &valueBuffer)) + value->deviceClass = (uint32_t) strtoul(valueBuffer.chars, NULL, 16); ffStrbufSubstrBefore(dir, dirLength); - return value->name.length > 0 || value->deviceClass.length > 0; + return value->name.length > 0 || value->deviceClass > 0; } -const FFTempsResult* ffDetectTemps(const FFinstance* instance) +const FFTempsResult* ffDetectTemps() { static FFTempsResult result; static FFThreadMutex mutex = FF_THREAD_MUTEX_INITIALIZER; @@ -49,13 +52,6 @@ const FFTempsResult* ffDetectTemps(const FFinstance* instance) } init = true; - if(!instance->config.allowSlowOperations) - { - ffListInitA(&result.values, sizeof(FFTempValue), 0); - ffThreadMutexUnlock(&mutex); - return &result; - } - ffListInitA(&result.values, sizeof(FFTempValue), 16); FFstrbuf baseDir; @@ -83,11 +79,10 @@ const FFTempsResult* ffDetectTemps(const FFinstance* instance) FFTempValue* temp = ffListAdd(&result.values); ffStrbufInit(&temp->name); - ffStrbufInit(&temp->deviceClass); + temp->deviceClass = 0; if(!parseHwmonDir(&baseDir, temp)) { ffStrbufDestroy(&temp->name); - ffStrbufDestroy(&temp->deviceClass); --result.values.length; } diff --git a/src/detection/temps/temps_linux.h b/src/detection/temps/temps_linux.h index 6bece23ed..569bd0401 100644 --- a/src/detection/temps/temps_linux.h +++ b/src/detection/temps/temps_linux.h @@ -8,7 +8,7 @@ typedef struct FFTempValue { FFstrbuf name; - FFstrbuf deviceClass; + uint32_t deviceClass; double value; } FFTempValue; @@ -17,6 +17,6 @@ typedef struct FFTempsResult FFlist values; //List of FFTempValue } FFTempsResult; -const FFTempsResult* ffDetectTemps(const FFinstance* instance); +const FFTempsResult* ffDetectTemps(); #endif