15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/param.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/shm.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/sysctl.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int64 AmountOfMemory(int pages_name) {
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  long pages = sysconf(pages_name);
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  long page_size = sysconf(_SC_PAGESIZE);
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (pages == -1 || page_size == -1) {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return 0;
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return static_cast<int64>(pages) * page_size;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SysInfo::NumberOfProcessors() {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mib[] = { CTL_HW, HW_NCPU };
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ncpu;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size = sizeof(ncpu);
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sysctl(mib, arraysize(mib), &ncpu, &size, NULL, 0) < 0) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ncpu;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 SysInfo::AmountOfPhysicalMemory() {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return AmountOfMemory(_SC_PHYS_PAGES);
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int64 SysInfo::AmountOfAvailablePhysicalMemory() {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return AmountOfMemory(_SC_AVPHYS_PAGES);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t SysInfo::MaxSharedMemorySize() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mib[] = { CTL_KERN, KERN_SHMINFO, KERN_SHMINFO_SHMMAX };
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t limit;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size = sizeof(limit);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sysctl(mib, arraysize(mib), &limit, &size, NULL, 0) < 0) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return limit;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string SysInfo::CPUModelName() {
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int mib[] = { CTL_HW, HW_MODEL };
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  char name[256];
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  size_t len = arraysize(name);
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sysctl(mib, arraysize(mib), name, &len, NULL, 0) < 0) {
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return std::string();
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return name;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
76