1
1
#include "cpu.h"
2
2
#include "common/sysctl.h"
3
+ #include "util/stringUtils.h"
3
4
5
+ #include <errno.h>
4
6
#include <sys/time.h>
5
7
#include <sys/sensors.h>
6
8
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 )
8
51
{
9
52
if (ffSysctlGetString (CTL_HW , HW_MODEL , & cpu -> name ))
10
53
return "sysctl(hw.model) failed" ;
@@ -19,13 +62,7 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
19
62
if (cpuspeed > cpu -> frequencyBase ) cpu -> frequencyBase = cpuspeed ;
20
63
21
64
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 );
29
66
30
67
return NULL ;
31
68
}
0 commit comments