summaryrefslogtreecommitdiff
path: root/Source/WTF/wtf/NumberOfCores.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WTF/wtf/NumberOfCores.cpp')
-rw-r--r--Source/WTF/wtf/NumberOfCores.cpp21
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);