aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--linden/indra/llcommon/llsys.cpp124
-rw-r--r--linden/indra/llcommon/llsys.h7
2 files changed, 122 insertions, 9 deletions
diff --git a/linden/indra/llcommon/llsys.cpp b/linden/indra/llcommon/llsys.cpp
index a56ac47..ee27a49 100644
--- a/linden/indra/llcommon/llsys.cpp
+++ b/linden/indra/llcommon/llsys.cpp
@@ -76,6 +76,75 @@ extern int errno;
76static const S32 CPUINFO_BUFFER_SIZE = 16383; 76static const S32 CPUINFO_BUFFER_SIZE = 16383;
77LLCPUInfo gSysCPU; 77LLCPUInfo gSysCPU;
78 78
79#if LL_WINDOWS
80#ifndef DLLVERSIONINFO
81typedef struct _DllVersionInfo
82{
83 DWORD cbSize;
84 DWORD dwMajorVersion;
85 DWORD dwMinorVersion;
86 DWORD dwBuildNumber;
87 DWORD dwPlatformID;
88}DLLVERSIONINFO;
89#endif
90
91#ifndef DLLGETVERSIONPROC
92typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
93#endif
94
95bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
96{
97 bool result = false;
98 const U32 BUFF_SIZE = 32767;
99 WCHAR tempBuf[BUFF_SIZE];
100 if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
101 {
102
103 std::basic_string<WCHAR> shell32_path(tempBuf);
104
105 // Shell32.dll contains the DLLGetVersion function.
106 // according to msdn its not part of the API
107 // so you have to go in and get it.
108 // http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
109 shell32_path += TEXT("\\shell32.dll");
110
111 HMODULE hDllInst = LoadLibrary(shell32_path.c_str()); //load the DLL
112 if(hDllInst)
113 { // Could successfully load the DLL
114 DLLGETVERSIONPROC pDllGetVersion;
115 /*
116 You must get this function explicitly because earlier versions of the DLL
117 don't implement this function. That makes the lack of implementation of the
118 function a version marker in itself.
119 */
120 pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst,
121 "DllGetVersion");
122
123 if(pDllGetVersion)
124 {
125 // DLL supports version retrieval function
126 DLLVERSIONINFO dvi;
127
128 ZeroMemory(&dvi, sizeof(dvi));
129 dvi.cbSize = sizeof(dvi);
130 HRESULT hr = (*pDllGetVersion)(&dvi);
131
132 if(SUCCEEDED(hr))
133 { // Finally, the version is at our hands
134 major = dvi.dwMajorVersion;
135 minor = dvi.dwMinorVersion;
136 build_number = dvi.dwBuildNumber;
137 result = true;
138 }
139 }
140
141 FreeLibrary(hDllInst); // Release DLL
142 }
143 }
144 return result;
145}
146#endif // LL_WINDOWS
147
79LLOSInfo::LLOSInfo() : 148LLOSInfo::LLOSInfo() :
80 mMajorVer(0), mMinorVer(0), mBuild(0) 149 mMajorVer(0), mMinorVer(0), mBuild(0)
81{ 150{
@@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() :
98 mMinorVer = osvi.dwMinorVersion; 167 mMinorVer = osvi.dwMinorVersion;
99 mBuild = osvi.dwBuildNumber; 168 mBuild = osvi.dwBuildNumber;
100 169
170 DWORD shell32_major, shell32_minor, shell32_build;
171 bool got_shell32_version = get_shell32_dll_version(shell32_major,
172 shell32_minor,
173 shell32_build);
174
101 switch(osvi.dwPlatformId) 175 switch(osvi.dwPlatformId)
102 { 176 {
103 case VER_PLATFORM_WIN32_NT: 177 case VER_PLATFORM_WIN32_NT:
@@ -146,8 +220,8 @@ LLOSInfo::LLOSInfo() :
146 pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); //load kernel32 get function 220 pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); //load kernel32 get function
147 if(NULL != pGNSI) //check if it has failed 221 if(NULL != pGNSI) //check if it has failed
148 pGNSI(&si); //success 222 pGNSI(&si); //success
149 else 223 else
150 GetSystemInfo(&si); //if it fails get regular system info 224 GetSystemInfo(&si); //if it fails get regular system info
151 //(Warning: If GetSystemInfo it may result in incorrect information in a WOW64 machine, if the kernel fails to load) 225 //(Warning: If GetSystemInfo it may result in incorrect information in a WOW64 machine, if the kernel fails to load)
152 226
153 //msdn microsoft finds 32 bit and 64 bit flavors this way.. 227 //msdn microsoft finds 32 bit and 64 bit flavors this way..
@@ -206,6 +280,7 @@ LLOSInfo::LLOSInfo() :
206 csdversion.c_str(), 280 csdversion.c_str(),
207 (osvi.dwBuildNumber & 0xffff)); 281 (osvi.dwBuildNumber & 0xffff));
208 } 282 }
283
209 mOSString = mOSStringSimple + tmpstr; 284 mOSString = mOSStringSimple + tmpstr;
210 } 285 }
211 break; 286 break;
@@ -235,6 +310,21 @@ LLOSInfo::LLOSInfo() :
235 mOSString = mOSStringSimple; 310 mOSString = mOSStringSimple;
236 break; 311 break;
237 } 312 }
313
314 std::string compatibility_mode;
315 if(got_shell32_version)
316 {
317 if(osvi.dwMajorVersion != shell32_major
318 || osvi.dwMinorVersion != shell32_minor)
319 {
320 compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)",
321 shell32_major,
322 shell32_minor,
323 shell32_build);
324 }
325 }
326 mOSString += compatibility_mode;
327
238#else 328#else
239 struct utsname un; 329 struct utsname un;
240 if(uname(&un) != -1) 330 if(uname(&un) != -1)
@@ -262,8 +352,8 @@ LLOSInfo::LLOSInfo() :
262 else if (ostype == "Linux") 352 else if (ostype == "Linux")
263 { 353 {
264 // Only care about major and minor Linux versions, truncate at second '.' 354 // Only care about major and minor Linux versions, truncate at second '.'
265 S32 idx1 = mOSStringSimple.find_first_of(".", 0); 355 std::string::size_type idx1 = mOSStringSimple.find_first_of(".", 0);
266 S32 idx2 = (idx1 != std::string::npos) ? mOSStringSimple.find_first_of(".", idx1+1) : std::string::npos; 356 std::string::size_type idx2 = (idx1 != std::string::npos) ? mOSStringSimple.find_first_of(".", idx1+1) : std::string::npos;
267 std::string simple = mOSStringSimple.substr(0, idx2); 357 std::string simple = mOSStringSimple.substr(0, idx2);
268 if (simple.length() > 0) 358 if (simple.length() > 0)
269 mOSStringSimple = simple; 359 mOSStringSimple = simple;
@@ -429,7 +519,7 @@ LLCPUInfo::LLCPUInfo()
429 mHasSSE = info->_Ext.SSE_StreamingSIMD_Extensions; 519 mHasSSE = info->_Ext.SSE_StreamingSIMD_Extensions;
430 mHasSSE2 = info->_Ext.SSE2_StreamingSIMD2_Extensions; 520 mHasSSE2 = info->_Ext.SSE2_StreamingSIMD2_Extensions;
431 mHasAltivec = info->_Ext.Altivec_Extensions; 521 mHasAltivec = info->_Ext.Altivec_Extensions;
432 mCPUMhz = (S32)(proc.GetCPUFrequency(50)/1000000.0); 522 mCPUMhz = (F64)(proc.GetCPUFrequency(50)/1000000.0);
433 mFamily.assign( info->strFamily ); 523 mFamily.assign( info->strFamily );
434 mCPUString = "Unknown"; 524 mCPUString = "Unknown";
435 525
@@ -482,7 +572,7 @@ LLCPUInfo::LLCPUInfo()
482 if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz) 572 if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz)
483 && 200.0 < mhz && mhz < 10000.0) 573 && 200.0 < mhz && mhz < 10000.0)
484 { 574 {
485 mCPUMhz = (S32)llrint(mhz); 575 mCPUMhz = (F64)llrint(mhz);
486 } 576 }
487 if (!cpuinfo["model name"].empty()) 577 if (!cpuinfo["model name"].empty())
488 mCPUString = cpuinfo["model name"]; 578 mCPUString = cpuinfo["model name"];
@@ -505,7 +595,7 @@ bool LLCPUInfo::hasSSE2() const
505 return mHasSSE2; 595 return mHasSSE2;
506} 596}
507 597
508S32 LLCPUInfo::getMhz() const 598F64 LLCPUInfo::getMhz() const
509{ 599{
510 return mCPUMhz; 600 return mCPUMhz;
511} 601}
@@ -631,6 +721,26 @@ U32 LLMemoryInfo::getPhysicalMemoryClamped() const
631 } 721 }
632} 722}
633 723
724//static
725void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb)
726{
727#if LL_WINDOWS
728 MEMORYSTATUSEX state;
729 state.dwLength = sizeof(state);
730 GlobalMemoryStatusEx(&state);
731
732 avail_physical_mem_kb = (U32)(state.ullAvailPhys/1024) ;
733 avail_virtual_mem_kb = (U32)(state.ullAvailVirtual/1024) ;
734
735#else
736 //do not know how to collect available memory info for other systems.
737 //leave it blank here for now.
738
739 avail_physical_mem_kb = -1 ;
740 avail_virtual_mem_kb = -1 ;
741#endif
742}
743
634void LLMemoryInfo::stream(std::ostream& s) const 744void LLMemoryInfo::stream(std::ostream& s) const
635{ 745{
636#if LL_WINDOWS 746#if LL_WINDOWS
diff --git a/linden/indra/llcommon/llsys.h b/linden/indra/llcommon/llsys.h
index d5575b2..d680e1a 100644
--- a/linden/indra/llcommon/llsys.h
+++ b/linden/indra/llcommon/llsys.h
@@ -81,7 +81,7 @@ public:
81 bool hasAltivec() const; 81 bool hasAltivec() const;
82 bool hasSSE() const; 82 bool hasSSE() const;
83 bool hasSSE2() const; 83 bool hasSSE2() const;
84 S32 getMhz() const; 84 F64 getMhz() const;
85 85
86 // Family is "AMD Duron" or "Intel Pentium Pro" 86 // Family is "AMD Duron" or "Intel Pentium Pro"
87 const std::string& getFamily() const { return mFamily; } 87 const std::string& getFamily() const { return mFamily; }
@@ -90,7 +90,7 @@ private:
90 bool mHasSSE; 90 bool mHasSSE;
91 bool mHasSSE2; 91 bool mHasSSE2;
92 bool mHasAltivec; 92 bool mHasAltivec;
93 S32 mCPUMhz; 93 F64 mCPUMhz;
94 std::string mFamily; 94 std::string mFamily;
95 std::string mCPUString; 95 std::string mCPUString;
96}; 96};
@@ -120,6 +120,9 @@ public:
120 ** be returned. 120 ** be returned.
121 */ 121 */
122 U32 getPhysicalMemoryClamped() const; ///< Memory size in clamped bytes 122 U32 getPhysicalMemoryClamped() const; ///< Memory size in clamped bytes
123
124 //get the available memory infomation in KiloBytes.
125 static void getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb);
123}; 126};
124 127
125 128