Changeset 46618 in vbox
- Timestamp:
- Jun 18, 2013 12:04:42 PM (11 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/Runtime/r3/win/mp-win.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/win/mp-win.cpp
r46617 r46618 94 94 RTDECL(RTCPUID) RTMpGetCoreCount(void) 95 95 { 96 PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pSysInfo = NULL;97 PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pSysInfoTmp = NULL;98 DWORD sysProcInfoLen = 0;99 DWORD offset = 0;100 DWORD coreCount = 0;101 BOOL rc;102 96 BOOL (WINAPI *pfnGetLogicalProcInfo)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD); 103 97 104 98 pfnGetLogicalProcInfo = (BOOL (WINAPI *)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD)) 105 99 GetProcAddress(GetModuleHandle("KERNEL32.DLL"), "GetLogicalProcessorInformation"); 106 /* 0 represent error condition. Can't return VERR* error codes as caller expects a unsigned value of core count.*/ 100 /* 0 represents an error condition. We cannot return VERR* error codes as caller expects a 101 * unsigned value of core count.*/ 107 102 if (!pfnGetLogicalProcInfo) 108 103 return 0; 109 104 110 rc = pfnGetLogicalProcInfo(pSysInfo, &sysProcInfoLen); 111 if (rc == FALSE) 105 PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pSysInfo = NULL; 106 DWORD cbSysProcInfo = 0; 107 BOOL fRc = pfnGetLogicalProcInfo(pSysInfo, &cbSysProcInfo); 108 if (!fRc) 112 109 { 113 110 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 114 { 115 RTMemFree(pSysInfo); 116 pSysInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)RTMemAlloc(sysProcInfoLen); 117 if (!pSysInfo) 118 return 0; 119 } 120 else 121 return 0; 111 pSysInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)RTMemAlloc(cbSysProcInfo); 122 112 } 123 113 124 rc = pfnGetLogicalProcInfo(pSysInfo, &sysProcInfoLen);125 if ( rc == FALSE)114 RTCPUID cCores = 0; 115 if (pSysInfo) 126 116 { 117 fRc = pfnGetLogicalProcInfo(pSysInfo, &cbSysProcInfo); 118 if (fRc) 119 { 120 PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pSysInfoTmp = pSysInfo; 121 size_t offs = 0; 122 while (offs + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= cbSysProcInfo) 123 { 124 switch (pSysInfoTmp->Relationship) 125 { 126 case RelationProcessorCore: 127 cCore++; 128 break; 129 case RelationCache: 130 case RelationNumaNode: 131 case RelationProcessorPackage: 132 default: 133 ; 134 } 135 offs += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); 136 pSysInfoTmp++; 137 } 138 } 127 139 RTMemFree(pSysInfo); 128 return 0;129 140 } 130 pSysInfoTmp = pSysInfo; 131 while (offset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= sysProcInfoLen) 132 { 133 switch (pSysInfoTmp->Relationship) 134 { 135 case RelationProcessorCore: 136 coreCount++; 137 break; 138 case RelationCache: 139 case RelationNumaNode: 140 case RelationProcessorPackage: 141 default: 142 ; 143 } 144 offset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); 145 pSysInfoTmp++; 146 } 147 RTMemFree(pSysInfo); 148 return coreCount; 141 return cCores; 149 142 } 150 143
Note:
See TracChangeset
for help on using the changeset viewer.

