diff options
author | Christopher Wilcox <git@crwilcox.com> | 2017-08-30 09:01:08 (GMT) |
---|---|---|
committer | Antoine Pitrou <pitrou@free.fr> | 2017-08-30 09:01:08 (GMT) |
commit | c67bae04780f9d7590f9f91b4ee5f31c5d75b3c3 (patch) | |
tree | 2599fdcf438728cf0e0679470327a2e94f93e8e7 /Modules/posixmodule.c | |
parent | 390eadd6d041611511dc761bc7d4581530dbd287 (diff) | |
download | cpython-c67bae04780f9d7590f9f91b4ee5f31c5d75b3c3.zip cpython-c67bae04780f9d7590f9f91b4ee5f31c5d75b3c3.tar.gz cpython-c67bae04780f9d7590f9f91b4ee5f31c5d75b3c3.tar.bz2 |
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
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r-- | Modules/posixmodule.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index f057787..e8138d5 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) |