Temp: fix severial issues. Fixes #398

1. Temp detection has been gated behind of `--*-temp`. Don't make it a slow operation
2. According to [the kernel doc](https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface), `temp1_input` is millidegree Celsius, which should be divided by 1000
3. There is no `/sys/class/hwmon/hwmon3/device/class` on my laptop, but `/sys/class/hwmon/hwmon3/device/device/class`. Need to confirm with @LinusDierheimer
4. Small code optimizations
This commit is contained in:
李通洲
2023-01-21 06:18:19 +08:00
parent a71f2142bb
commit 6f4bdafb0c
4 changed files with 21 additions and 30 deletions
+2 -2
View File
@@ -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++)
{
+4 -8
View File
@@ -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)
+13 -18
View File
@@ -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;
}
+2 -2
View File
@@ -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