From 231e568fcfe678e1ebd1f40e600287c1b1c396df Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 26 Aug 2024 10:22:42 +0200 Subject: [PATCH] win: compute parallelism from process cpu affinity (#4521) Use GetProcessAffinityMask() to estimate the available parallelism. Before this commit, it simply used the number of available CPUs. Fixes: https://github.com/libuv/libuv/issues/4520 (cherry picked from commit 58dfb6c89ba3deb23301ddbdd4a8769f4c767dff) --- src/win/util.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/win/util.c b/src/win/util.c index bba37f89e71..a4341a9cdb5 100644 --- a/src/win/util.c +++ b/src/win/util.c @@ -513,19 +513,23 @@ int uv_uptime(double* uptime) { unsigned int uv_available_parallelism(void) { - SYSTEM_INFO info; - unsigned rc; + DWORD_PTR procmask; + DWORD_PTR sysmask; + int count; + int i; /* TODO(bnoordhuis) Use GetLogicalProcessorInformationEx() to support systems * with > 64 CPUs? See https://github.com/libuv/libuv/pull/3458 */ - GetSystemInfo(&info); + count = 0; + if (GetProcessAffinityMask(GetCurrentProcess(), &procmask, &sysmask)) + for (i = 0; i < 64; i++) /* a.k.a. count = popcount(procmask); */ + count += 1 & (procmask >> i); - rc = info.dwNumberOfProcessors; - if (rc < 1) - rc = 1; + if (count > 0) + return count; - return rc; + return 1; }