MCPcopy Create free account
hub / github.com/cameron314/concurrentqueue / getProcessorInfoFromOS

Function getProcessorInfoFromOS

benchmarks/cpuid.cpp:26–106  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

24}
25
26bool getProcessorInfoFromOS(int& cpus, int& cores, int& logicalCores, double& clockSpeed)
27{
28 cpus = 0;
29 cores = 0;
30 logicalCores = 0;
31 clockSpeed = 0;
32
33 // Clock speed
34 HKEY hKey;
35 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"), 0, KEY_EXECUTE, &hKey) == ERROR_SUCCESS) {
36 DWORD type = REG_DWORD;
37 DWORD val;
38 DWORD cbData = sizeof(val);
39 if (RegQueryValueEx(hKey, TEXT("~MHz"), NULL, &type, (LPBYTE)&val, &cbData) == ERROR_SUCCESS) {
40 if (type == REG_DWORD && cbData == sizeof(DWORD)) {
41 clockSpeed = val / 1000.0;
42 }
43 }
44
45 }
46 if (clockSpeed == 0) {
47 // Can't access registry, try QueryPerformanceFrequency (nearly always same speed as CPU)
48 LARGE_INTEGER f;
49 if (!QueryPerformanceFrequency(&f)) {
50 return false;
51 }
52 clockSpeed = f.QuadPart / 1000.0 / 1000.0;
53 }
54
55 // Everything else
56 LPFN_GLPI glpi;
57 glpi = (LPFN_GLPI)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "GetLogicalProcessorInformation");
58 if (glpi == NULL) {
59 return false;
60 }
61
62 PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
63 DWORD bufferLength = 0;
64 if (glpi(buffer, &bufferLength) == TRUE) {
65 return false;
66 }
67
68 while (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
69 if (buffer != NULL) {
70 std::free(buffer);
71 }
72 buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)std::malloc(bufferLength);
73 if (buffer == NULL) {
74 return false;
75 }
76 if (glpi(buffer, &bufferLength) == TRUE) {
77 if (bufferLength / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) * sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) != bufferLength) {
78 // sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) must have changed (different from at compile time)
79 std::free(buffer);
80 return false;
81 }
82
83 auto end = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)((char*)buffer + bufferLength);

Callers 1

getCPUStringFunction · 0.85

Calls 3

GetLastErrorFunction · 0.85
freeFunction · 0.85
countBitsSetFunction · 0.85

Tested by

no test coverage detected