diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/llprocessor.cpp | 83 | 
1 files changed, 56 insertions, 27 deletions
| diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp index ce3b1160c0..4cdc3d7519 100644 --- a/indra/llcommon/llprocessor.cpp +++ b/indra/llcommon/llprocessor.cpp @@ -793,19 +793,55 @@ private:  };  #elif LL_LINUX + +// *NOTE:Mani - eww, macros! srry. +#define LLPI_SET_INFO_STRING(llpi_id, cpuinfo_id) \ +		if (!cpuinfo[cpuinfo_id].empty()) \ +		{ setInfo(llpi_id, cpuinfo[cpuinfo_id]);} + +#define LLPI_SET_INFO_INT(llpi_id, cpuinfo_id) \ +		{\ +			S32 result; \ +			if (!cpuinfo[cpuinfo_id].empty() \ +				&& LLStringUtil::convertToS32(cpuinfo[cpuinfo_id], result))	\ +		    { setInfo(llpi_id, result);} \ +		} +  const char CPUINFO_FILE[] = "/proc/cpuinfo"; -class LLProcessorInfoLinuxImpl : public LLProcessorInfoImpl -{ +class LLProcessorInfoLinuxImpl : public LLProcessorInfoImpl {  public: -	LLProcessorInfoLinuxImpl()  -	{ -		get_proc_cpuinfo(); -	} +    LLProcessorInfoLinuxImpl() { +        get_proc_cpuinfo(); +    } + +    virtual ~LLProcessorInfoLinuxImpl() {} -	virtual ~LLProcessorInfoLinuxImpl() {}  private: +    F64 getCPUMaxMHZ() +    { +        // Nicky: We just look into cpu0. In theory we could iterate over all cores +        // "/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq" +        // But those should not fluctuate that much? +        std::ifstream fIn { "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" }; + +        if( !fIn.is_open() ) +            return 0.0; + +        std::string strLine; +        fIn >> strLine; +        if( strLine.empty() ) +            return 0.0l; + +        F64 mhz {}; +        if( !LLStringUtil::convertToF64(strLine, mhz ) ) +            return 0.0; + +        mhz = mhz / 1000.0; +        return mhz; +    } +  	void get_proc_cpuinfo()  	{  		std::map< std::string, std::string > cpuinfo; @@ -834,31 +870,24 @@ private:  				std::string llinename(linename);  				LLStringUtil::toLower(llinename);  				std::string lineval( spacespot + 1, nlspot ); -				cpuinfo[ llinename ] = lineval; +                    cpuinfo[ llinename ] = lineval;  			}  			fclose(cpuinfo_fp);  		}  # if LL_X86 -// *NOTE:Mani - eww, macros! srry. -#define LLPI_SET_INFO_STRING(llpi_id, cpuinfo_id) \ -		if (!cpuinfo[cpuinfo_id].empty()) \ -		{ setInfo(llpi_id, cpuinfo[cpuinfo_id]);} - -#define LLPI_SET_INFO_INT(llpi_id, cpuinfo_id) \ -		{\ -			S32 result; \ -			if (!cpuinfo[cpuinfo_id].empty() \ -				&& LLStringUtil::convertToS32(cpuinfo[cpuinfo_id], result))	\ -		    { setInfo(llpi_id, result);} \ -		} -		 -		F64 mhz; -		if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz) -			&& 200.0 < mhz && mhz < 10000.0) -		{ -		    setInfo(eFrequency,(F64)(mhz)); -		} +        F64 mhzFromSys = getCPUMaxMHZ(); +        F64 mhzFromProc {}; +        if( !LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhzFromProc ) ) +            mhzFromProc = 0.0; +        if (mhzFromSys > 1.0 && mhzFromSys > mhzFromProc ) +        { +            setInfo( eFrequency, mhzFromSys ); +        } +        else if (  200.0 < mhzFromProc && mhzFromProc < 10000.0) +        { +            setInfo(eFrequency,(F64)(mhzFromProc)); +        }  		LLPI_SET_INFO_STRING(eBrandName, "model name");		  		LLPI_SET_INFO_STRING(eVendor, "vendor_id"); | 
