From c67bae04780f9d7590f9f91b4ee5f31c5d75b3c3 Mon Sep 17 00:00:00 2001 From: Christopher Wilcox Date: Wed, 30 Aug 2017 05:01:08 -0400 Subject: [PATCH] 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 --- .../2017-08-04-10-05-19.bpo-30581.OQhR7l.rst | 2 ++ Modules/posixmodule.c | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2017-08-04-10-05-19.bpo-30581.OQhR7l.rst diff --git a/Misc/NEWS.d/next/Windows/2017-08-04-10-05-19.bpo-30581.OQhR7l.rst b/Misc/NEWS.d/next/Windows/2017-08-04-10-05-19.bpo-30581.OQhR7l.rst new file mode 100644 index 0000000000..6591fa0df0 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2017-08-04-10-05-19.bpo-30581.OQhR7l.rst @@ -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. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index f057787433..e8138d5d3c 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -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) -- 2.40.0