17b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 27b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 37b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org// found in the LICENSE file. 47b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 57b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include "src/base/sys-info.h" 67b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 77b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#if V8_OS_POSIX 87b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include <sys/resource.h> 97b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include <sys/stat.h> 107b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include <sys/time.h> 117b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include <sys/types.h> 127b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include <unistd.h> 137b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#endif 147b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 157b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#if V8_OS_BSD 167b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include <sys/sysctl.h> 177b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#endif 187b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 197b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include <limits> 207b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 217b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include "src/base/logging.h" 227b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include "src/base/macros.h" 237b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#if V8_OS_WIN 247b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include "src/base/win32-headers.h" 257b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#endif 267b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 277b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.orgnamespace v8 { 287b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.orgnamespace base { 297b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 307b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org// static 317b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.orgint SysInfo::NumberOfProcessors() { 327b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#if V8_OS_OPENBSD 337b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org int mib[2] = {CTL_HW, HW_NCPU}; 347b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org int ncpu = 0; 357b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org size_t len = sizeof(ncpu); 367b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (sysctl(mib, arraysize(mib), &ncpu, &len, NULL, 0) != 0) { 377b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org UNREACHABLE(); 387b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return 1; 397b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 407b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return ncpu; 417b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#elif V8_OS_POSIX 427b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org long result = sysconf(_SC_NPROCESSORS_ONLN); // NOLINT(runtime/int) 437b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (result == -1) { 447b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org UNREACHABLE(); 457b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return 1; 467b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 477b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return static_cast<int>(result); 487b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#elif V8_OS_WIN 497b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org SYSTEM_INFO system_info = {0}; 507b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org ::GetNativeSystemInfo(&system_info); 517b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return static_cast<int>(system_info.dwNumberOfProcessors); 527b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#endif 537b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org} 547b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 557b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 567b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org// static 577b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.orgint64_t SysInfo::AmountOfPhysicalMemory() { 587b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#if V8_OS_MACOSX 597b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org int mib[2] = {CTL_HW, HW_MEMSIZE}; 607b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org int64_t memsize = 0; 617b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org size_t len = sizeof(memsize); 627b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (sysctl(mib, arraysize(mib), &memsize, &len, NULL, 0) != 0) { 637b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org UNREACHABLE(); 647b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return 0; 657b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 667b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return memsize; 677b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#elif V8_OS_FREEBSD 687b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org int pages, page_size; 697b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org size_t size = sizeof(pages); 707b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org sysctlbyname("vm.stats.vm.v_page_count", &pages, &size, NULL, 0); 717b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org sysctlbyname("vm.stats.vm.v_page_size", &page_size, &size, NULL, 0); 727b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (pages == -1 || page_size == -1) { 737b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org UNREACHABLE(); 747b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return 0; 757b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 767b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return static_cast<int64_t>(pages) * page_size; 777b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#elif V8_OS_CYGWIN || V8_OS_WIN 787b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org MEMORYSTATUSEX memory_info; 797b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org memory_info.dwLength = sizeof(memory_info); 807b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (!GlobalMemoryStatusEx(&memory_info)) { 817b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org UNREACHABLE(); 827b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return 0; 837b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 847b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org int64_t result = static_cast<int64_t>(memory_info.ullTotalPhys); 857b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (result < 0) result = std::numeric_limits<int64_t>::max(); 867b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return result; 877b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#elif V8_OS_QNX 887b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org struct stat stat_buf; 897b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (stat("/proc", &stat_buf) != 0) { 907b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org UNREACHABLE(); 917b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return 0; 927b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 937b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return static_cast<int64_t>(stat_buf.st_size); 94d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org#elif V8_OS_NACL 95d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org // No support for _SC_PHYS_PAGES, assume 2GB. 96d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org return static_cast<int64_t>(1) << 31; 977b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#elif V8_OS_POSIX 987b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org long pages = sysconf(_SC_PHYS_PAGES); // NOLINT(runtime/int) 997b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org long page_size = sysconf(_SC_PAGESIZE); // NOLINT(runtime/int) 1007b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (pages == -1 || page_size == -1) { 1017b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org UNREACHABLE(); 1027b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return 0; 1037b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 1047b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return static_cast<int64_t>(pages) * page_size; 1057b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#endif 1067b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org} 1077b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 1087b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 1097b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org// static 1107b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.orgint64_t SysInfo::AmountOfVirtualMemory() { 1117b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#if V8_OS_NACL || V8_OS_WIN 1127b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return 0; 1137b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#elif V8_OS_POSIX 1147b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org struct rlimit rlim; 1157b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org int result = getrlimit(RLIMIT_DATA, &rlim); 1167b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (result != 0) { 1177b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org UNREACHABLE(); 1187b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return 0; 1197b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 1207b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org return (rlim.rlim_cur == RLIM_INFINITY) ? 0 : rlim.rlim_cur; 1217b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#endif 1227b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org} 1237b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org 1247b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org} // namespace base 1257b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org} // namespace v8 126