1// Copyright 2014 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "src/base/sys-info.h" 6 7#if V8_OS_POSIX 8#include <sys/resource.h> 9#include <sys/stat.h> 10#include <sys/time.h> 11#include <sys/types.h> 12#include <unistd.h> 13#endif 14 15#if V8_OS_BSD 16#include <sys/sysctl.h> 17#endif 18 19#include <limits> 20 21#include "src/base/logging.h" 22#include "src/base/macros.h" 23#if V8_OS_WIN 24#include "src/base/win32-headers.h" 25#endif 26 27namespace v8 { 28namespace base { 29 30// static 31int SysInfo::NumberOfProcessors() { 32#if V8_OS_OPENBSD 33 int mib[2] = {CTL_HW, HW_NCPU}; 34 int ncpu = 0; 35 size_t len = sizeof(ncpu); 36 if (sysctl(mib, arraysize(mib), &ncpu, &len, NULL, 0) != 0) { 37 UNREACHABLE(); 38 return 1; 39 } 40 return ncpu; 41#elif V8_OS_POSIX 42 long result = sysconf(_SC_NPROCESSORS_ONLN); // NOLINT(runtime/int) 43 if (result == -1) { 44 UNREACHABLE(); 45 return 1; 46 } 47 return static_cast<int>(result); 48#elif V8_OS_WIN 49 SYSTEM_INFO system_info = {0}; 50 ::GetNativeSystemInfo(&system_info); 51 return static_cast<int>(system_info.dwNumberOfProcessors); 52#endif 53} 54 55 56// static 57int64_t SysInfo::AmountOfPhysicalMemory() { 58#if V8_OS_MACOSX 59 int mib[2] = {CTL_HW, HW_MEMSIZE}; 60 int64_t memsize = 0; 61 size_t len = sizeof(memsize); 62 if (sysctl(mib, arraysize(mib), &memsize, &len, NULL, 0) != 0) { 63 UNREACHABLE(); 64 return 0; 65 } 66 return memsize; 67#elif V8_OS_FREEBSD 68 int pages, page_size; 69 size_t size = sizeof(pages); 70 sysctlbyname("vm.stats.vm.v_page_count", &pages, &size, NULL, 0); 71 sysctlbyname("vm.stats.vm.v_page_size", &page_size, &size, NULL, 0); 72 if (pages == -1 || page_size == -1) { 73 UNREACHABLE(); 74 return 0; 75 } 76 return static_cast<int64_t>(pages) * page_size; 77#elif V8_OS_CYGWIN || V8_OS_WIN 78 MEMORYSTATUSEX memory_info; 79 memory_info.dwLength = sizeof(memory_info); 80 if (!GlobalMemoryStatusEx(&memory_info)) { 81 UNREACHABLE(); 82 return 0; 83 } 84 int64_t result = static_cast<int64_t>(memory_info.ullTotalPhys); 85 if (result < 0) result = std::numeric_limits<int64_t>::max(); 86 return result; 87#elif V8_OS_QNX 88 struct stat stat_buf; 89 if (stat("/proc", &stat_buf) != 0) { 90 UNREACHABLE(); 91 return 0; 92 } 93 return static_cast<int64_t>(stat_buf.st_size); 94#elif V8_OS_NACL 95 // No support for _SC_PHYS_PAGES, assume 2GB. 96 return static_cast<int64_t>(1) << 31; 97#elif V8_OS_POSIX 98 long pages = sysconf(_SC_PHYS_PAGES); // NOLINT(runtime/int) 99 long page_size = sysconf(_SC_PAGESIZE); // NOLINT(runtime/int) 100 if (pages == -1 || page_size == -1) { 101 UNREACHABLE(); 102 return 0; 103 } 104 return static_cast<int64_t>(pages) * page_size; 105#endif 106} 107 108 109// static 110int64_t SysInfo::AmountOfVirtualMemory() { 111#if V8_OS_NACL || V8_OS_WIN 112 return 0; 113#elif V8_OS_POSIX 114 struct rlimit rlim; 115 int result = getrlimit(RLIMIT_DATA, &rlim); 116 if (result != 0) { 117 UNREACHABLE(); 118 return 0; 119 } 120 return (rlim.rlim_cur == RLIM_INFINITY) ? 0 : rlim.rlim_cur; 121#endif 122} 123 124} // namespace base 125} // namespace v8 126