@@ -26,7 +26,7 @@ static void detectAndroid(FFCPUResult* cpu)
2626}
2727#endif
2828
29- static const char * parseCpuInfo (FFCPUResult * cpu , FFstrbuf * physicalCoresBuffer , FFstrbuf * cpuMHz , FFstrbuf * cpuIsa , FFstrbuf * cpuUarch )
29+ static const char * parseCpuInfo (FFCPUResult * cpu , FFstrbuf * physicalCoresBuffer , FFstrbuf * cpuIsa , FFstrbuf * cpuUarch )
3030{
3131 FF_AUTO_CLOSE_FILE FILE * cpuinfo = fopen ("/proc/cpuinfo" , "r" );
3232 if (cpuinfo == NULL )
@@ -49,7 +49,6 @@ static const char* parseCpuInfo(FFCPUResult* cpu, FFstrbuf* physicalCoresBuffer,
4949 ffParsePropLine (line , "model name :" , & cpu -> name ) ||
5050 ffParsePropLine (line , "vendor_id :" , & cpu -> vendor ) ||
5151 ffParsePropLine (line , "cpu cores :" , physicalCoresBuffer ) ||
52- ffParsePropLine (line , "cpu MHz :" , cpuMHz ) ||
5352 ffParsePropLine (line , "isa :" , cpuIsa ) ||
5453 ffParsePropLine (line , "uarch :" , cpuUarch ) ||
5554
@@ -102,7 +101,7 @@ static double getFrequency(FFstrbuf* basePath, const char* cpuinfoFileName, cons
102101 if (ok )
103102 return ffStrbufToDouble (buffer ) / 1e6 ;
104103 }
105-
104+
106105 return 0.0 /0.0 ;
107106}
108107
@@ -123,10 +122,28 @@ static bool detectFrequency(FFCPUResult* cpu)
123122 ffStrbufAppendS (& path , entry -> d_name );
124123 double fbase = getFrequency (& path , "/base_frequency" , NULL , & buffer );
125124 if (fbase == fbase )
126- cpu -> frequencyBase = cpu -> frequencyBase > fbase ? cpu -> frequencyBase : fbase ;
125+ {
126+ if (cpu -> frequencyBase == cpu -> frequencyBase )
127+ cpu -> frequencyBase = cpu -> frequencyBase > fbase ? cpu -> frequencyBase : fbase ;
128+ else
129+ cpu -> frequencyBase = fbase ;
130+ }
127131 double fmax = getFrequency (& path , "/cpuinfo_max_freq" , "/scaling_max_freq" , & buffer );
128132 if (fmax == fmax )
129- cpu -> frequencyMax = cpu -> frequencyMax > fmax ? cpu -> frequencyMax : fmax ;
133+ {
134+ if (cpu -> frequencyMax == cpu -> frequencyMax )
135+ cpu -> frequencyMax = cpu -> frequencyMax > fmax ? cpu -> frequencyMax : fmax ;
136+ else
137+ cpu -> frequencyMax = fmax ;
138+ }
139+ double fmin = getFrequency (& path , "/cpuinfo_min_freq" , "/scaling_min_freq" , & buffer );
140+ if (fmin == fmin )
141+ {
142+ if (cpu -> frequencyMin == cpu -> frequencyMin )
143+ cpu -> frequencyMin = cpu -> frequencyMin < fmin ? cpu -> frequencyMin : fmin ;
144+ else
145+ cpu -> frequencyMin = fmin ;
146+ }
130147 ffStrbufSubstrBefore (& path , baseLen );
131148 }
132149 }
@@ -215,19 +232,18 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
215232 cpu -> temperature = options -> temp ? detectCPUTemp () : FF_CPU_TEMP_UNSET ;
216233
217234 FF_STRBUF_AUTO_DESTROY physicalCoresBuffer = ffStrbufCreate ();
218- FF_STRBUF_AUTO_DESTROY cpuMHz = ffStrbufCreate ();
219235 FF_STRBUF_AUTO_DESTROY cpuIsa = ffStrbufCreate ();
220236 FF_STRBUF_AUTO_DESTROY cpuUarch = ffStrbufCreate ();
221237
222- const char * error = parseCpuInfo (cpu , & physicalCoresBuffer , & cpuMHz , & cpuIsa , & cpuUarch );
238+ const char * error = parseCpuInfo (cpu , & physicalCoresBuffer , & cpuIsa , & cpuUarch );
223239 if (error ) return error ;
224240
225241 cpu -> coresLogical = (uint16_t ) get_nprocs_conf ();
226242 cpu -> coresOnline = (uint16_t ) get_nprocs ();
227243 cpu -> coresPhysical = (uint16_t ) ffStrbufToUInt (& physicalCoresBuffer , cpu -> coresLogical );
228244
229- if (! detectFrequency (cpu ))
230- cpu -> frequencyBase = cpu -> frequencyMax = ffStrbufToDouble ( & cpuMHz ) / 1000 ;
245+ detectFrequency (cpu );
246+ // cpu MHz is current frequency, not max or base
231247
232248 if (cpuUarch .length > 0 )
233249 {
0 commit comments