#include "util/sys_info.h"
#include "base/logging.h"
#include "util/build_config.h"
#if defined(OS_POSIX)
#include <sys/utsname.h>
#include <unistd.h>
#endif
#if defined(OS_MACOSX)
#include <sys/sysctl.h>
#include <sys/types.h>
#endif
#if defined(OS_WIN)
#include <windows.h>
#include "base/win/registry.h"
#endif
bool IsLongPathsSupportEnabled() {
#if defined(OS_WIN)
struct LongPathSupport {
LongPathSupport() {
HINSTANCE ntdll_lib = GetModuleHandleW(L"ntdll");
if (ntdll_lib) {
using FunctionType = BOOLEAN(WINAPI*)();
auto func_ptr = reinterpret_cast<FunctionType>(
GetProcAddress(ntdll_lib, "RtlAreLongPathsEnabled"));
if (func_ptr) {
supported = func_ptr();
return;
}
}
const char16_t key_name[] =
uR"(SYSTEM\CurrentControlSet\Control\FileSystem)";
const char16_t value_name[] = u"LongPathsEnabled";
base::win::RegKey key(HKEY_LOCAL_MACHINE, key_name, KEY_READ);
DWORD value;
if (key.ReadValueDW(value_name, &value) == ERROR_SUCCESS) {
supported = value == 1;
}
}
bool supported = false;
};
static LongPathSupport s_long_paths;
return s_long_paths.supported;
#else
return true;
#endif
}
std::string OperatingSystemArchitecture() {
#if defined(OS_POSIX)
struct utsname info;
if (uname(&info) < 0) {
NOTREACHED();
return std::string();
}
std::string arch(info.machine);
std::string os(info.sysname);
if (arch == "i386" || arch == "i486" || arch == "i586" || arch == "i686") {
arch = "x86";
} else if (arch == "i86pc") {
arch = "x86_64";
} else if (arch == "amd64") {
arch = "x86_64";
} else if (os == "AIX" || os == "OS400") {
arch = "ppc64";
} else if (std::string(info.sysname) == "OS/390") {
arch = "s390x";
}
return arch;
#elif defined(OS_WIN)
SYSTEM_INFO system_info = {};
::GetNativeSystemInfo(&system_info);
switch (system_info.wProcessorArchitecture) {
case PROCESSOR_ARCHITECTURE_INTEL:
return "x86";
case PROCESSOR_ARCHITECTURE_AMD64:
return "x86_64";
case PROCESSOR_ARCHITECTURE_IA64:
return "ia64";
}
return std::string();
#else
#error
#endif
}
int NumberOfProcessors() {
#if defined(OS_ZOS)
return __get_num_online_cpus();
#elif defined(OS_POSIX)
long res = sysconf(_SC_NPROCESSORS_CONF);
if (res == -1) {
NOTREACHED();
return 1;
}
return static_cast<int>(res);
#elif defined(OS_WIN)
SYSTEM_INFO system_info = {};
::GetNativeSystemInfo(&system_info);
return system_info.dwNumberOfProcessors;
#else
#error
#endif
}
int NumberOfPerformanceProcessors() {
#if defined(OS_MACOSX) && defined(ARCH_CPU_ARM64)
int nperflevels;
size_t len = sizeof(nperflevels);
if (sysctlbyname("hw.nperflevels", &nperflevels, &len, nullptr, 0) == 0) {
if (nperflevels > 0) {
int perflevel0_cores;
len = sizeof(perflevel0_cores);
if (sysctlbyname("hw.perflevel0.physicalcpu", &perflevel0_cores, &len,
nullptr, 0) == 0) {
return perflevel0_cores;
}
}
}
#endif
return NumberOfProcessors();
}