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 18 namespace base { 19 20 // static 21 std::string SysInfo::OperatingSystemName() { 22 return "Mac OS X"; 23 } 24 25 // static 26 std::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 33 void 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 45 int64 SysInfo::AmountOfPhysicalMemory() { 46 struct host_basic_info hostinfo; 47 mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT; 48 base::mac::ScopedMachPort 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 62 int64 SysInfo::AmountOfAvailablePhysicalMemory() { 63 base::mac::ScopedMachPort 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 80 std::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