1// Copyright (c) 2012 The Chromium 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 "base/sys_info.h"
6
7#include <ApplicationServices/ApplicationServices.h>
8#include <CoreServices/CoreServices.h>
9#include <mach/mach_host.h>
10#include <mach/mach_init.h>
11#include <sys/sysctl.h>
12#include <sys/types.h>
13
14#include "base/logging.h"
15#include "base/mac/scoped_mach_port.h"
16#include "base/strings/stringprintf.h"
17
18namespace base {
19
20// static
21std::string SysInfo::OperatingSystemName() {
22  return "Mac OS X";
23}
24
25// static
26std::string SysInfo::OperatingSystemVersion() {
27  int32 major, minor, bugfix;
28  OperatingSystemVersionNumbers(&major, &minor, &bugfix);
29  return base::StringPrintf("%d.%d.%d", major, minor, bugfix);
30}
31
32// static
33void SysInfo::OperatingSystemVersionNumbers(int32* major_version,
34                                            int32* minor_version,
35                                            int32* bugfix_version) {
36  Gestalt(gestaltSystemVersionMajor,
37      reinterpret_cast<SInt32*>(major_version));
38  Gestalt(gestaltSystemVersionMinor,
39      reinterpret_cast<SInt32*>(minor_version));
40  Gestalt(gestaltSystemVersionBugFix,
41      reinterpret_cast<SInt32*>(bugfix_version));
42}
43
44// static
45int64 SysInfo::AmountOfPhysicalMemory() {
46  struct host_basic_info hostinfo;
47  mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT;
48  base::mac::ScopedMachSendRight host(mach_host_self());
49  int result = host_info(host,
50                         HOST_BASIC_INFO,
51                         reinterpret_cast<host_info_t>(&hostinfo),
52                         &count);
53  if (result != KERN_SUCCESS) {
54    NOTREACHED();
55    return 0;
56  }
57  DCHECK_EQ(HOST_BASIC_INFO_COUNT, count);
58  return static_cast<int64>(hostinfo.max_mem);
59}
60
61// static
62int64 SysInfo::AmountOfAvailablePhysicalMemory() {
63  base::mac::ScopedMachSendRight host(mach_host_self());
64  vm_statistics_data_t vm_info;
65  mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
66
67  if (host_statistics(host.get(),
68                      HOST_VM_INFO,
69                      reinterpret_cast<host_info_t>(&vm_info),
70                      &count) != KERN_SUCCESS) {
71    NOTREACHED();
72    return 0;
73  }
74
75  return static_cast<int64>(
76      vm_info.free_count - vm_info.speculative_count) * PAGE_SIZE;
77}
78
79// static
80std::string SysInfo::CPUModelName() {
81  char name[256];
82  size_t len = arraysize(name);
83  if (sysctlbyname("machdep.cpu.brand_string", &name, &len, NULL, 0) == 0)
84    return name;
85  return std::string();
86}
87
88}  // namespace base
89