From 9f5046d69f047a4319900f5be9e75fc8bb892b8c Mon Sep 17 00:00:00 2001 From: Carter Li Date: Thu, 28 Aug 2025 18:58:00 +0800 Subject: [PATCH] CPU/GPU (Linux): Improves CPU/GPU temp detection accuracy on Linux/Android --- src/detection/cpu/cpu_linux.c | 52 +++++++++++++++++++-------------- src/detection/gpu/gpu_android.c | 10 +++---- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index 1a95c3e16..0c4cda409 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -15,14 +15,22 @@ static double parseTZDir(int dfd, FFstrbuf* buffer) { - if(!ffReadFileBufferRelative(dfd, "temp", buffer)) + if (!ffReadFileBufferRelative(dfd, "type", buffer)) + return FF_CPU_TEMP_UNSET; + + if (!ffStrbufStartsWithS(buffer, "cpu") && + !ffStrbufStartsWithS(buffer, "soc") && + #if __x86_64__ || __i386__ + !ffStrbufEqualS(buffer, "x86_pkg_temp") && + #endif + true + ) return FF_CPU_TEMP_UNSET; + + if (!ffReadFileBufferRelative(dfd, "temp", buffer)) return FF_CPU_TEMP_UNSET; double value = ffStrbufToDouble(buffer, FF_CPU_TEMP_UNSET);// millidegree Celsius - if(value == FF_CPU_TEMP_UNSET) - return FF_CPU_TEMP_UNSET; - - if (!ffReadFileBufferRelative(dfd, "type", buffer) || ffStrbufStartsWithS(buffer, "cpu")) + if (value == FF_CPU_TEMP_UNSET) return FF_CPU_TEMP_UNSET; return value / 1000.; @@ -30,30 +38,30 @@ static double parseTZDir(int dfd, FFstrbuf* buffer) static double parseHwmonDir(int dfd, FFstrbuf* buffer) { - //https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface - if(!ffReadFileBufferRelative(dfd, "temp1_input", buffer)) - return FF_CPU_TEMP_UNSET; - - double value = ffStrbufToDouble(buffer, FF_CPU_TEMP_UNSET);// millidegree Celsius - if(value == FF_CPU_TEMP_UNSET) - return FF_CPU_TEMP_UNSET; - - if (!ffReadFileBufferRelative(dfd, "temp1_label", buffer)) + if (!ffReadFileBufferRelative(dfd, "name", buffer)) return FF_CPU_TEMP_UNSET; ffStrbufTrimRightSpace(buffer); - if( - ffStrbufContainS(buffer, "cpu") || + if ( + !ffStrbufContainS(buffer, "cpu") && #if __x86_64__ || __i386__ - ffStrbufEqualS(buffer, "k10temp") || // AMD - ffStrbufEqualS(buffer, "fam15h_power") || // AMD - ffStrbufEqualS(buffer, "coretemp") || // Intel + !ffStrbufEqualS(buffer, "k10temp") && // AMD + !ffStrbufEqualS(buffer, "fam15h_power") && // AMD + !ffStrbufEqualS(buffer, "coretemp") && // Intel #endif - false - ) return value / 1000.; + true + ) return FF_CPU_TEMP_UNSET; - return FF_CPU_TEMP_UNSET; + //https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface + if (!ffReadFileBufferRelative(dfd, "temp1_input", buffer)) + return FF_CPU_TEMP_UNSET; + + double value = ffStrbufToDouble(buffer, FF_CPU_TEMP_UNSET);// millidegree Celsius + if (value == FF_CPU_TEMP_UNSET) + return FF_CPU_TEMP_UNSET; + + return value / 1000.; } static double detectCPUTemp(void) diff --git a/src/detection/gpu/gpu_android.c b/src/detection/gpu/gpu_android.c index dc3c44953..a0406790f 100644 --- a/src/detection/gpu/gpu_android.c +++ b/src/detection/gpu/gpu_android.c @@ -6,14 +6,14 @@ static double parseTZDir(int dfd, FFstrbuf* buffer) { - if(!ffReadFileBufferRelative(dfd, "temp", buffer)) + if (!ffReadFileBufferRelative(dfd, "type", buffer) || !ffStrbufStartsWithS(buffer, "gpu")) + return FF_GPU_TEMP_UNSET; + + if (!ffReadFileBufferRelative(dfd, "temp", buffer)) return FF_GPU_TEMP_UNSET; double value = ffStrbufToDouble(buffer, FF_GPU_TEMP_UNSET);// millidegree Celsius - if(value == FF_GPU_TEMP_UNSET) - return FF_GPU_TEMP_UNSET; - - if (!ffReadFileBufferRelative(dfd, "type", buffer) || ffStrbufStartsWithS(buffer, "gpu")) + if (value == FF_GPU_TEMP_UNSET) return FF_GPU_TEMP_UNSET; return value / 1000.;