Skip to content
Permalink
Browse files

bpo-30581: Windows: os.cpu_count() returns wrong number of processors (

…#2934)

* Fixes #30581 by adding a path to use newer GetMaximumProcessorCount API on Windows calls to os.cpu_count()

* Add NEWS.d entry for bpo-30581, os.cpu_count on Windows.

* Tweak NEWS entry
  • Loading branch information...
crwilcox authored and pitrou committed Aug 30, 2017
1 parent 390eadd commit c67bae04780f9d7590f9f91b4ee5f31c5d75b3c3
Showing with 18 additions and 3 deletions.
  1. +2 −0 Misc/NEWS.d/next/Windows/2017-08-04-10-05-19.bpo-30581.OQhR7l.rst
  2. +16 −3 Modules/posixmodule.c
@@ -0,0 +1,2 @@
os.cpu_count() now returns the correct number of processors on Windows
when the number of logical processors is greater than 64.
@@ -11174,9 +11174,22 @@ os_cpu_count_impl(PyObject *module)
{
int ncpu = 0;
#ifdef MS_WINDOWS
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
ncpu = sysinfo.dwNumberOfProcessors;
/* Vista is supported and the GetMaximumProcessorCount API is Win7+
Need to fallback to Vista behavior if this call isn't present */
HINSTANCE hKernel32;
hKernel32 = GetModuleHandleW(L"KERNEL32");

static DWORD(CALLBACK *_GetMaximumProcessorCount)(WORD) = NULL;
*(FARPROC*)&_GetMaximumProcessorCount = GetProcAddress(hKernel32,
"GetMaximumProcessorCount");
if (_GetMaximumProcessorCount != NULL) {
ncpu = _GetMaximumProcessorCount(ALL_PROCESSOR_GROUPS);
}
else {
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
ncpu = sysinfo.dwNumberOfProcessors;
}
#elif defined(__hpux)
ncpu = mpctl(MPC_GETNUMSPUS, NULL, NULL);
#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)

0 comments on commit c67bae0

Please sign in to comment.
You can’t perform that action at this time.