1*6777b538SAndroid Build Coastguard Worker// Copyright 2023 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker#include "base/system/sys_info.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker#include <sys/sysctl.h> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker#include "base/strings/stringprintf.h" 10*6777b538SAndroid Build Coastguard Worker#include "base/system/sys_info_internal.h" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Workernamespace base { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Workernamespace internal { 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker// Queries sysctlbyname() for the given key and returns the 32 bit integer value 17*6777b538SAndroid Build Coastguard Worker// from the system or std::nullopt on failure. 18*6777b538SAndroid Build Coastguard Worker// https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/sys/sysctl.h#L1224-L1225 19*6777b538SAndroid Build Coastguard Workerstd::optional<int> GetSysctlIntValue(const char* key_name) { 20*6777b538SAndroid Build Coastguard Worker int value; 21*6777b538SAndroid Build Coastguard Worker size_t len = sizeof(value); 22*6777b538SAndroid Build Coastguard Worker if (sysctlbyname(key_name, &value, &len, nullptr, 0) != 0) { 23*6777b538SAndroid Build Coastguard Worker return std::nullopt; 24*6777b538SAndroid Build Coastguard Worker } 25*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(len, sizeof(value)); 26*6777b538SAndroid Build Coastguard Worker return value; 27*6777b538SAndroid Build Coastguard Worker} 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker} // namespace internal 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker// static 32*6777b538SAndroid Build Coastguard Workerint SysInfo::NumberOfEfficientProcessorsImpl() { 33*6777b538SAndroid Build Coastguard Worker int num_perf_levels = 34*6777b538SAndroid Build Coastguard Worker internal::GetSysctlIntValue("hw.nperflevels").value_or(1); 35*6777b538SAndroid Build Coastguard Worker if (num_perf_levels == 1) { 36*6777b538SAndroid Build Coastguard Worker return 0; 37*6777b538SAndroid Build Coastguard Worker } 38*6777b538SAndroid Build Coastguard Worker DCHECK_GE(num_perf_levels, 2); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // Lower values of perflevel indicate higher-performance core types. See 41*6777b538SAndroid Build Coastguard Worker // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_system_capabilities?changes=l__5 42*6777b538SAndroid Build Coastguard Worker int num_of_efficient_processors = 43*6777b538SAndroid Build Coastguard Worker internal::GetSysctlIntValue( 44*6777b538SAndroid Build Coastguard Worker StringPrintf("hw.perflevel%d.logicalcpu", num_perf_levels - 1) 45*6777b538SAndroid Build Coastguard Worker .c_str()) 46*6777b538SAndroid Build Coastguard Worker .value_or(0); 47*6777b538SAndroid Build Coastguard Worker DCHECK_GE(num_of_efficient_processors, 0); 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker return num_of_efficient_processors; 50*6777b538SAndroid Build Coastguard Worker} 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker} // namespace base 53