11#include "cpu.h"
22#include "common/sysctl.h"
3+ #include "util/stringUtils.h"
34
5+ #include <errno.h>
46#include <sys/time.h>
57#include <sys/sensors.h>
68
7- const char * ffDetectCPUImpl (const FFCPUOptions * options , FFCPUResult * cpu )
9+ static const char * detectCPUTemp (FFCPUResult * cpu )
10+ {
11+ int mib [5 ] = {CTL_HW , HW_SENSORS , 0 , SENSOR_TEMP , 0 };
12+
13+ for (mib [2 ] = 0 ; mib [2 ] < 1024 ; mib [2 ]++ )
14+ {
15+ struct sensordev sensordev ;
16+ size_t sdlen = sizeof (struct sensordev );
17+ if (sysctl (mib , 3 , & sensordev , & sdlen , NULL , 0 ) < 0 )
18+ {
19+ if (errno == ENOENT )
20+ break ;
21+ if (errno == ENXIO )
22+ continue ;
23+ return "sysctl(sensordev) failed" ;
24+ }
25+
26+ if (!ffStrStartsWith (sensordev .xname , "cpu" ))
27+ continue ;
28+
29+ for (mib [4 ] = 0 ; mib [4 ] < sensordev .maxnumt [SENSOR_TEMP ]; mib [4 ]++ )
30+ {
31+ struct sensor sensor ;
32+ size_t slen = sizeof (struct sensor );
33+ if (sysctl (mib , 5 , & sensor , & slen , NULL , 0 ) < 0 )
34+ {
35+ if (errno != ENOENT )
36+ return "sysctl(sensor) failed" ;
37+ continue ;
38+ }
39+ if (sensor .flags & SENSOR_FINVALID )
40+ continue ;
41+
42+ cpu -> temperature = (double )(sensor .value - 273150000 ) / 1E6 ;
43+ return NULL ;
44+ }
45+ }
46+
47+ return "No sensor for CPU temp found" ;
48+ }
49+
50+ const char * ffDetectCPUImpl (const FFCPUOptions * options , FFCPUResult * cpu )
851{
952 if (ffSysctlGetString (CTL_HW , HW_MODEL , & cpu -> name ))
1053 return "sysctl(hw.model) failed" ;
@@ -19,13 +62,7 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
1962 if (cpuspeed > cpu -> frequencyBase ) cpu -> frequencyBase = cpuspeed ;
2063
2164 cpu -> temperature = FF_CPU_TEMP_UNSET ;
22- if (options -> temp )
23- {
24- struct sensor sensors ;
25- size_t size = sizeof (sensors );
26- if (sysctl ((int []) {CTL_HW , HW_SENSORS , 0 , SENSOR_TEMP , 0 }, 5 , & sensors , & size , NULL , 0 ) == 0 )
27- cpu -> temperature = (double ) (sensors .value - 273150000 ) / 1E6 ;
28- }
65+ if (options -> temp ) detectCPUTemp (cpu );
2966
3067 return NULL ;
3168}
0 commit comments