diff options
Diffstat (limited to 'Source/WTF/wtf/NumberOfCores.cpp')
-rw-r--r-- | Source/WTF/wtf/NumberOfCores.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/Source/WTF/wtf/NumberOfCores.cpp b/Source/WTF/wtf/NumberOfCores.cpp index 75d8af70f..ea5f825dc 100644 --- a/Source/WTF/wtf/NumberOfCores.cpp +++ b/Source/WTF/wtf/NumberOfCores.cpp @@ -26,13 +26,15 @@ #include "config.h" #include "NumberOfCores.h" -#if OS(DARWIN) || OS(OPENBSD) || OS(NETBSD) || OS(FREEBSD) +#include <cstdio> + +#if OS(DARWIN) #include <sys/param.h> // sys/types.h must come before sys/sysctl.h because the latter uses // data types defined in the former. See sysctl(3) and style(9). #include <sys/types.h> #include <sys/sysctl.h> -#elif OS(LINUX) || OS(AIX) || OS(SOLARIS) +#elif OS(LINUX) || OS(AIX) || OS(SOLARIS) || OS(OPENBSD) || OS(NETBSD) || OS(FREEBSD) #include <unistd.h> #elif OS(WINDOWS) #include <windows.h> @@ -47,18 +49,27 @@ int numberOfProcessorCores() if (s_numberOfCores > 0) return s_numberOfCores; + + if (const char* coresEnv = getenv("WTF_numberOfProcessorCores")) { + unsigned numberOfCores; + if (sscanf(coresEnv, "%u", &numberOfCores) == 1) { + s_numberOfCores = numberOfCores; + return s_numberOfCores; + } else + fprintf(stderr, "WARNING: failed to parse WTF_numberOfProcessorCores=%s\n", coresEnv); + } -#if OS(DARWIN) || OS(OPENBSD) || OS(NETBSD) || OS(FREEBSD) +#if OS(DARWIN) unsigned result; size_t length = sizeof(result); int name[] = { CTL_HW, - HW_NCPU + HW_AVAILCPU }; int sysctlResult = sysctl(name, sizeof(name) / sizeof(int), &result, &length, 0, 0); s_numberOfCores = sysctlResult < 0 ? defaultIfUnavailable : result; -#elif OS(LINUX) || OS(AIX) || OS(SOLARIS) +#elif OS(LINUX) || OS(AIX) || OS(SOLARIS) || OS(OPENBSD) || OS(NETBSD) || OS(FREEBSD) long sysconfResult = sysconf(_SC_NPROCESSORS_ONLN); s_numberOfCores = sysconfResult < 0 ? defaultIfUnavailable : static_cast<int>(sysconfResult); |