in ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psutil_windows.c [451:515]
typedef BOOL (WINAPI *LPFN_GLPI) (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION,
PDWORD);
/*
* Return the number of physical CPU cores.
*/
static PyObject *
psutil_cpu_count_phys(PyObject *self, PyObject *args)
{
LPFN_GLPI glpi;
DWORD rc;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
DWORD length = 0;
DWORD offset = 0;
int ncpus = 0;
glpi = (LPFN_GLPI)GetProcAddress(GetModuleHandle(TEXT("kernel32")),
"GetLogicalProcessorInformation");
if (glpi == NULL)
goto return_none;
while (1) {
rc = glpi(buffer, &length);
if (rc == FALSE) {
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
if (buffer)
free(buffer);
buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(
length);
if (NULL == buffer) {
PyErr_NoMemory();
return NULL;
}
}
else {
goto return_none;
}
}
else {
break;
}
}
ptr = buffer;
while (offset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= length) {
if (ptr->Relationship == RelationProcessorCore)
ncpus += 1;
offset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
ptr++;
}
free(buffer);
if (ncpus == 0)
goto return_none;
else
return Py_BuildValue("i", ncpus);
return_none:
// mimic os.cpu_count()
if (buffer != NULL)
free(buffer);
Py_INCREF(Py_None);
return Py_None;
}