Implement OS::get_processor_count() for Windows

Current this is hardcoded as '1' for any platform except Unix. The
little is_wow64() dance is required to get correct output on a 32bit
compiled godot running on 64bit Windows according to MSDN.

This code should be UWP safe but I have no way to test that so it's not
implemented for UWP yet.

(cherry picked from commit b4d369c887)
This commit is contained in:
Hein-Pieter van Braam 2018-01-29 16:46:30 +01:00
parent 77d27053c3
commit a34afa3820
2 changed files with 33 additions and 0 deletions

View File

@ -2211,6 +2211,36 @@ String OS_Windows::get_locale() const {
return "en"; 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 { OS::LatinKeyboardVariant OS_Windows::get_latin_keyboard_variant() const {
unsigned long azerty[] = { unsigned long azerty[] = {

View File

@ -253,6 +253,9 @@ public:
virtual String get_executable_path() const; virtual String get_executable_path() const;
virtual String get_locale() const; virtual String get_locale() const;
virtual int get_processor_count() const;
virtual LatinKeyboardVariant get_latin_keyboard_variant() const; virtual LatinKeyboardVariant get_latin_keyboard_variant() const;
virtual void enable_for_stealing_focus(ProcessID pid); virtual void enable_for_stealing_focus(ProcessID pid);