summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <rverschelde@gmail.com>2018-01-30 13:41:03 +0100
committerGitHub <noreply@github.com>2018-01-30 13:41:03 +0100
commit22ef1fa23db420522d8ba0126e1708b992c82dc3 (patch)
treeecf6f754ca221295d2c93f9621eac0acffcef009
parentfb08607aeecb8f70f998058f39aded11df9426ea (diff)
parentb4d369c887001a824a4f27e59e3e300c8d4a5bb7 (diff)
Merge pull request #16162 from hpvb/implement-windows-processor-count
Implement OS::get_processor_count() for Windows
-rw-r--r--platform/windows/os_windows.cpp30
-rw-r--r--platform/windows/os_windows.h3
2 files changed, 33 insertions, 0 deletions
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index 43f2a5cf7d..a2a51f10a7 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -2211,6 +2211,36 @@ String OS_Windows::get_locale() const {
return "en";
}
+// We need this because GetSystemInfo() is unreliable on WOW64
+// see https://msdn.microsoft.com/en-us/library/windows/desktop/ms724381(v=vs.85).aspx
+// Taken from MSDN
+typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
+LPFN_ISWOW64PROCESS fnIsWow64Process;
+
+BOOL is_wow64() {
+ BOOL wow64 = FALSE;
+
+ fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
+
+ if (fnIsWow64Process) {
+ if (!fnIsWow64Process(GetCurrentProcess(), &wow64)) {
+ wow64 = FALSE;
+ }
+ }
+
+ return wow64;
+}
+
+int OS_Windows::get_processor_count() const {
+ SYSTEM_INFO sysinfo;
+ if (is_wow64())
+ GetNativeSystemInfo(&sysinfo);
+ else
+ GetSystemInfo(&sysinfo);
+
+ return sysinfo.dwNumberOfProcessors;
+}
+
OS::LatinKeyboardVariant OS_Windows::get_latin_keyboard_variant() const {
unsigned long azerty[] = {
diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h
index c24e35e929..7308650695 100644
--- a/platform/windows/os_windows.h
+++ b/platform/windows/os_windows.h
@@ -253,6 +253,9 @@ public:
virtual String get_executable_path() const;
virtual String get_locale() const;
+
+ virtual int get_processor_count() const;
+
virtual LatinKeyboardVariant get_latin_keyboard_variant() const;
virtual void enable_for_stealing_focus(ProcessID pid);