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