Skip to content

Commit 6f4bdaf

Browse files
committed
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
1 parent a71f214 commit 6f4bdaf

File tree

4 files changed

+21
-30
lines changed

4 files changed

+21
-30
lines changed

src/detection/cpu/cpu_linux.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ static double getFrequency(const char* info, const char* scaling)
6767
return getGHz(scaling);
6868
}
6969

70-
static double detectCPUTemp(const FFinstance* instance)
70+
static double detectCPUTemp()
7171
{
72-
const FFTempsResult* temps = ffDetectTemps(instance);
72+
const FFTempsResult* temps = ffDetectTemps();
7373

7474
for(uint32_t i = 0; i < temps->values.length; i++)
7575
{

src/detection/gpu/gpu_linux.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -146,20 +146,16 @@ static void pciDetectDriverName(FFGPUResult* gpu, PCIData* pci, struct pci_dev*
146146
ffStrbufDestroy(&path);
147147
}
148148

149-
static void pciDetectTemperatur(const FFinstance* instance, FFGPUResult* gpu, struct pci_dev* device)
149+
static void pciDetectTemperatur(FFGPUResult* gpu, struct pci_dev* device)
150150
{
151-
const FFTempsResult* tempsResult = ffDetectTemps(instance);
151+
const FFTempsResult* tempsResult = ffDetectTemps();
152152

153153
for(uint32_t i = 0; i < tempsResult->values.length; i++)
154154
{
155155
FFTempValue* tempValue = ffListGet(&tempsResult->values, i);
156156

157-
uint32_t tempClass;
158-
if(sscanf(tempValue->deviceClass.chars, "%x", &tempClass) != 1)
159-
continue;
160-
161157
//The kernel exposes the device class multiplied by 256 for some reason
162-
if(tempClass == device->device_class * 256)
158+
if(tempValue->deviceClass == device->device_class * 256)
163159
{
164160
gpu->temperature = tempValue->value;
165161
return;
@@ -233,7 +229,7 @@ static void pciHandleDevice(const FFinstance* instance, FFlist* results, PCIData
233229

234230
gpu->temperature = FF_GPU_TEMP_UNSET;
235231
if(instance->config.gpuTemp)
236-
pciDetectTemperatur(instance, gpu, device);
232+
pciDetectTemperatur(gpu, device);
237233
}
238234

239235
static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus)

src/detection/temps/temps_linux.c

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@
88

99
static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value)
1010
{
11+
//https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface
1112
uint32_t dirLength = dir->length;
1213

13-
FFstrbuf valueBuffer;
14+
FF_STRBUF_AUTO_DESTROY valueBuffer;
1415
ffStrbufInit(&valueBuffer);
1516

1617
ffStrbufAppendS(dir, "temp1_input");
17-
ffReadFileBuffer(dir->chars, &valueBuffer);
18-
ffStrbufSubstrBefore(dir, dirLength);
18+
if(!ffReadFileBuffer(dir->chars, &valueBuffer))
19+
return false;
1920

20-
value->value = ffStrbufToDouble(&valueBuffer);
21+
ffStrbufSubstrBefore(dir, dirLength);
2122

22-
ffStrbufDestroy(&valueBuffer);
23+
value->value = ffStrbufToDouble(&valueBuffer) / 1000; // valueBuffer is millidegree Celsius
2324

2425
if(value->value != value->value)
2526
return false;
@@ -28,14 +29,16 @@ static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value)
2829
ffReadFileBuffer(dir->chars, &value->name);
2930
ffStrbufSubstrBefore(dir, dirLength);
3031

31-
ffStrbufAppendS(dir, "device/class");
32-
ffReadFileBuffer(dir->chars, &value->deviceClass);
32+
ffStrbufAppendS(dir, "device/device/class");
33+
34+
if(ffReadFileBuffer(dir->chars, &valueBuffer))
35+
value->deviceClass = (uint32_t) strtoul(valueBuffer.chars, NULL, 16);
3336
ffStrbufSubstrBefore(dir, dirLength);
3437

35-
return value->name.length > 0 || value->deviceClass.length > 0;
38+
return value->name.length > 0 || value->deviceClass > 0;
3639
}
3740

38-
const FFTempsResult* ffDetectTemps(const FFinstance* instance)
41+
const FFTempsResult* ffDetectTemps()
3942
{
4043
static FFTempsResult result;
4144
static FFThreadMutex mutex = FF_THREAD_MUTEX_INITIALIZER;
@@ -49,13 +52,6 @@ const FFTempsResult* ffDetectTemps(const FFinstance* instance)
4952
}
5053
init = true;
5154

52-
if(!instance->config.allowSlowOperations)
53-
{
54-
ffListInitA(&result.values, sizeof(FFTempValue), 0);
55-
ffThreadMutexUnlock(&mutex);
56-
return &result;
57-
}
58-
5955
ffListInitA(&result.values, sizeof(FFTempValue), 16);
6056

6157
FFstrbuf baseDir;
@@ -83,11 +79,10 @@ const FFTempsResult* ffDetectTemps(const FFinstance* instance)
8379

8480
FFTempValue* temp = ffListAdd(&result.values);
8581
ffStrbufInit(&temp->name);
86-
ffStrbufInit(&temp->deviceClass);
82+
temp->deviceClass = 0;
8783
if(!parseHwmonDir(&baseDir, temp))
8884
{
8985
ffStrbufDestroy(&temp->name);
90-
ffStrbufDestroy(&temp->deviceClass);
9186
--result.values.length;
9287
}
9388

src/detection/temps/temps_linux.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
typedef struct FFTempValue
99
{
1010
FFstrbuf name;
11-
FFstrbuf deviceClass;
11+
uint32_t deviceClass;
1212
double value;
1313
} FFTempValue;
1414

@@ -17,6 +17,6 @@ typedef struct FFTempsResult
1717
FFlist values; //List of FFTempValue
1818
} FFTempsResult;
1919

20-
const FFTempsResult* ffDetectTemps(const FFinstance* instance);
20+
const FFTempsResult* ffDetectTemps();
2121

2222
#endif

0 commit comments

Comments
 (0)