#include <system_info.h>
Nevrax France
Definition at line 42 of file system_info.h.
Static Public Member Functions | |
| uint32 | availablePhysicalMemory () |
| std::string | getOS () |
| std::string | getProc () |
| uint64 | getProcessorFrequency (bool quick=false) |
| bool | hasCPUID () |
| bool | hasMMX () |
| bool | hasSSE () |
| bool | isNT () |
| uint32 | totalPhysicalMemory () |
Static Private Attributes | |
| bool | _HaveMMX = DetectMMX () |
| bool | _HaveSSE = DetectSSE () |
|
|
returns all the physical memory available on this computer Definition at line 671 of file system_info.cpp. References uint32.
00672 {
00673 #ifdef NL_OS_WINDOWS
00674
00675 MEMORYSTATUS ms;
00676 GlobalMemoryStatus (&ms);
00677 return ms.dwAvailPhys;
00678
00679 #elif defined NL_OS_UNIX
00680
00681 return getSystemMemory (2) + getSystemMemory (4) + getSystemMemory (5);
00682
00683 #endif
00684
00685 return 0;
00686 }
|
|
|
Definition at line 49 of file system_info.cpp. References buffer, len, nlwarning, and NLMISC::toString().
00050 {
00051 string OSString = "Unknown";
00052
00053 #ifdef NL_OS_WINDOWS
00054
00055 OSVERSIONINFOEX osvi;
00056 BOOL bOsVersionInfoEx;
00057 const int BUFSIZE = 80;
00058
00059 // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
00060 // If that fails, try using the OSVERSIONINFO structure.
00061
00062 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
00063 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
00064
00065 if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
00066 {
00067 osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
00068 if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
00069 return OSString+" Can't GetVersionEx()";
00070 }
00071
00072 switch (osvi.dwPlatformId)
00073 {
00074 // Test for the Windows NT product family.
00075 case VER_PLATFORM_WIN32_NT:
00076
00077 // Test for the specific product family.
00078 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
00079 OSString = "Microsoft Windows Server 2003 family ";
00080
00081 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
00082 OSString = "Microsoft Windows XP ";
00083
00084 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
00085 OSString = "Microsoft Windows 2000 ";
00086
00087 if ( osvi.dwMajorVersion <= 4 )
00088 OSString = "Microsoft Windows NT ";
00089
00090 // Test for specific product on Windows NT 4.0 SP6 and later.
00091 if( bOsVersionInfoEx )
00092 {
00093 // not available on visual 6 SP4, then comment it
00094
00095 /* // Test for the workstation type.
00096 if ( osvi.wProductType == VER_NT_WORKSTATION )
00097 {
00098 if( osvi.dwMajorVersion == 4 )
00099 printf ( "Workstation 4.0 " );
00100 else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
00101 printf ( "Home Edition " );
00102 else
00103 printf ( "Professional " );
00104 }
00105
00106 // Test for the server type.
00107 else if ( osvi.wProductType == VER_NT_SERVER )
00108 {
00109 if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
00110 {
00111 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
00112 printf ( "Datacenter Edition " );
00113 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
00114 printf ( "Enterprise Edition " );
00115 else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
00116 printf ( "Web Edition " );
00117 else
00118 printf ( "Standard Edition " );
00119 }
00120
00121 else if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
00122 {
00123 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
00124 printf ( "Datacenter Server " );
00125 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
00126 printf ( "Advanced Server " );
00127 else
00128 printf ( "Server " );
00129 }
00130
00131 else // Windows NT 4.0
00132 {
00133 if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
00134 printf ("Server 4.0, Enterprise Edition " );
00135 else
00136 printf ( "Server 4.0 " );
00137 }
00138 }*/
00139 }
00140 else // Test for specific product on Windows NT 4.0 SP5 and earlier
00141 {
00142 HKEY hKey;
00143 char szProductType[BUFSIZE];
00144 DWORD dwBufLen=BUFSIZE;
00145 LONG lRet;
00146
00147 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey );
00148 if( lRet != ERROR_SUCCESS )
00149 return OSString + " Can't RegOpenKeyEx";
00150
00151 lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen);
00152 if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE) )
00153 return OSString + " Can't ReQueryValueEx";
00154
00155 RegCloseKey( hKey );
00156
00157 if ( lstrcmpi( "WINNT", szProductType) == 0 )
00158 OSString += "Workstation ";
00159 if ( lstrcmpi( "LANMANNT", szProductType) == 0 )
00160 OSString += "Server ";
00161 if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
00162 OSString += "Advanced Server ";
00163 }
00164
00165 // Display service pack (if any) and build number.
00166
00167 if( osvi.dwMajorVersion == 4 && lstrcmpi( osvi.szCSDVersion, "Service Pack 6" ) == 0 )
00168 {
00169 HKEY hKey;
00170 LONG lRet;
00171
00172 // Test for SP6 versus SP6a.
00173 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009", 0, KEY_QUERY_VALUE, &hKey );
00174 if( lRet == ERROR_SUCCESS )
00175 OSString += toString("Service Pack 6a (Build %d) ", osvi.dwBuildNumber & 0xFFFF );
00176 else // Windows NT 4.0 prior to SP6a
00177 {
00178 OSString += toString("%s (Build %d) ", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
00179 }
00180
00181 RegCloseKey( hKey );
00182 }
00183 else // Windows NT 3.51 and earlier or Windows 2000 and later
00184 {
00185 OSString += toString("%s (Build %d) ", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
00186 }
00187
00188 break;
00189
00190 // Test for the Windows 95 product family.
00191 case VER_PLATFORM_WIN32_WINDOWS:
00192
00193 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
00194 {
00195 OSString = "Microsoft Windows 95 ";
00196 if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )
00197 OSString += "OSR2 ";
00198 }
00199
00200 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
00201 {
00202 OSString = "Microsoft Windows 98 ";
00203 if ( osvi.szCSDVersion[1] == 'A' )
00204 OSString += "SE ";
00205 }
00206
00207 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
00208 {
00209 OSString = "Microsoft Windows Millennium Edition ";
00210 }
00211 break;
00212
00213 case VER_PLATFORM_WIN32s:
00214
00215 OSString = "Microsoft Win32s ";
00216 break;
00217 }
00218
00219 OSString += toString( "(%d.%d %d)", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF);
00220
00221 #elif defined NL_OS_UNIX
00222
00223 int fd = open("/proc/version", O_RDONLY);
00224 if (fd == -1)
00225 {
00226 nlwarning ("SI: Can't get OS from /proc/version: %s", strerror (errno));
00227 }
00228 else
00229 {
00230 char buffer[4096+1];
00231 int len = read(fd, buffer, sizeof(buffer)-1);
00232 close(fd);
00233
00234 // remove the \n and set \0
00235 buffer[len-1] = '\0';
00236
00237 OSString = buffer;
00238 }
00239
00240 #endif // NL_OS_UNIX
00241
00242 return OSString;
00243 }
|
|
|
Definition at line 374 of file system_info.cpp. References value.
00375 {
00376 string ProcString = "Unknown";
00377
00378 #ifdef NL_OS_WINDOWS
00379
00380 LONG result;
00381 char value[1024];
00382 DWORD valueSize;
00383 HKEY hKey;
00384
00385 result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey);
00386 if (result == ERROR_SUCCESS)
00387 {
00388 // get processor name
00389 valueSize = 1024;
00390 result = ::RegQueryValueEx (hKey, _T("ProcessorNameString"), NULL, NULL, (LPBYTE)&value, &valueSize);
00391 if (result == ERROR_SUCCESS)
00392 ProcString = value;
00393 else
00394 ProcString = "UnknownProc";
00395
00396 ProcString += " / ";
00397
00398 // get processor identifier
00399 valueSize = 1024;
00400 result = ::RegQueryValueEx (hKey, _T("Identifier"), NULL, NULL, (LPBYTE)&value, &valueSize);
00401 if (result == ERROR_SUCCESS)
00402 ProcString += value;
00403 else
00404 ProcString += "UnknownIdentifier";
00405
00406 ProcString += " / ";
00407
00408 // get processor vendor
00409 valueSize = 1024;
00410 result = ::RegQueryValueEx (hKey, _T("VendorIdentifier"), NULL, NULL, (LPBYTE)&value, &valueSize);
00411 if (result == ERROR_SUCCESS)
00412 ProcString += value;
00413 else
00414 ProcString += "UnknownVendor";
00415
00416 ProcString += " / ";
00417
00418 // get processor frequence
00419 result = ::RegQueryValueEx (hKey, _T("~MHz"), NULL, NULL, (LPBYTE)&value, &valueSize);
00420 if (result == ERROR_SUCCESS)
00421 {
00422 ProcString += itoa (*(int *)value, value, 10);
00423 ProcString += "MHz";
00424 }
00425 else
00426 ProcString += "UnknownFreq";
00427 }
00428
00429 // Make sure to close the reg key
00430
00431 RegCloseKey (hKey);
00432
00433 #elif defined NL_OS_UNIX
00434
00435
00436 #endif
00437
00438 return ProcString;
00439 }
|
|
|
Gives an evalutation of the processor frequency, in hertz
Definition at line 441 of file system_info.cpp. References NLMISC::CTime::getPerformanceTime(), nlinfo, NLMISC::nlSleep(), NLMISC::TTicks, uint, and uint64.
00442 {
00443 static uint64 freq = 0;
00444 #ifdef NL_CPU_INTEL
00445 static bool freqComputed = false;
00446 if (freqComputed) return freq;
00447
00448 if (!quick)
00449 {
00450 TTicks bestNumTicks = 0;
00451 uint64 bestNumCycles;
00452 uint64 numCycles;
00453 const uint numSamples = 5;
00454 const uint numLoops = 50000000;
00455
00456 volatile uint k; // prevent optimisation for the loop
00457 for(uint l = 0; l < numSamples; ++l)
00458 {
00459 TTicks startTick = NLMISC::CTime::getPerformanceTime();
00460 uint64 startCycle = rdtsc();
00461 volatile uint dummy = 0;
00462 for(k = 0; k < numLoops; ++k)
00463 {
00464 ++ dummy;
00465 }
00466 numCycles = rdtsc() - startCycle;
00467 TTicks numTicks = NLMISC::CTime::getPerformanceTime() - startTick;
00468 if (numTicks > bestNumTicks)
00469 {
00470 bestNumTicks = numTicks;
00471 bestNumCycles = numCycles;
00472 }
00473 }
00474 freq = (uint64) ((double) bestNumCycles * 1 / CTime::ticksToSecond(bestNumTicks));
00475 }
00476 else
00477 {
00478 TTicks timeBefore = NLMISC::CTime::getPerformanceTime();
00479 uint64 tickBefore = rdtsc();
00480 nlSleep (100);
00481 TTicks timeAfter = NLMISC::CTime::getPerformanceTime();
00482 TTicks tickAfter = rdtsc();
00483
00484 double timeDelta = CTime::ticksToSecond(timeAfter - timeBefore);
00485 TTicks tickDelta = tickAfter - tickBefore;
00486
00487 freq = (uint64) ((double)tickDelta / timeDelta);
00488 }
00489
00490 nlinfo ("SI: CSystemInfo: Processor frequency is %.0f MHz", (float)freq/1000000.0);
00491 freqComputed = true;
00492 #endif // NL_CPU_INTEL
00493 return freq;
00494 }
|
|
|
test wether the cpuid instruction is supported (always false on non intel architectures) Definition at line 570 of file system_info.cpp. References uint32.
00571 {
00572 #ifdef NL_OS_WINDOWS
00573 uint32 result;
00574 __asm
00575 {
00576 pushad
00577 pushfd
00578 // If ID bit of EFLAGS can change, then cpuid is available
00579 pushfd
00580 pop eax // Get EFLAG
00581 mov ecx,eax
00582 xor eax,0x200000 // Flip ID bit
00583 push eax
00584 popfd // Write EFLAGS
00585 pushfd
00586 pop eax // read back EFLAG
00587 xor eax,ecx
00588 je noCpuid // no flip -> no CPUID instr.
00589
00590 popfd // restore state
00591 popad
00592 mov result, 1
00593 jmp CPUIDPresent
00594
00595 noCpuid:
00596 popfd // restore state
00597 popad
00598 mov result, 0
00599 CPUIDPresent:
00600 }
00601 return result == 1;
00602 #else
00603 return false;
00604 #endif
00605 }
|
|
|
helps to know wether the processor features mmx instruction set This is initialized at started, so its fast (always false on non 0x86 architecture ...) Definition at line 64 of file system_info.h. References _HaveMMX. Referenced by NL3D::computeGradient(), and NL3D::CTextureFar::rebuildPatch().
00064 {return _HaveMMX;}
|
|
|
helps to know wether the processor has streaming SIMD instructions (the OS must supports it) This is initialized at started, so its fast (always false on non 0x86 architecture ...) Definition at line 70 of file system_info.h. References _HaveSSE.
00070 {return _HaveSSE;}
|
|
|
Definition at line 608 of file system_info.cpp.
00609 {
00610 #ifdef NL_OS_WINDOWS
00611 OSVERSIONINFO ver;
00612 ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
00613 GetVersionEx(&ver);
00614 return ver.dwPlatformId == VER_PLATFORM_WIN32_NT;
00615 #else
00616 return false;
00617 #endif
00618 }
|
|
|
returns all the physical memory on this computer Definition at line 688 of file system_info.cpp. References uint32.
00689 {
00690 #ifdef NL_OS_WINDOWS
00691
00692 MEMORYSTATUS ms;
00693 GlobalMemoryStatus (&ms);
00694 return ms.dwTotalPhys;
00695
00696 #elif defined NL_OS_UNIX
00697
00698 return getSystemMemory (0);
00699
00700 #endif
00701
00702 return 0;
00703 }
|
|
|
Definition at line 567 of file system_info.cpp. Referenced by hasMMX(). |
|
|
Definition at line 568 of file system_info.cpp. Referenced by hasSSE(). |
1.3.6