1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/cpu_info.h" 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_WIN) 14*d9f75844SAndroid Build Coastguard Worker #include <windows.h> 15*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_LINUX) 16*d9f75844SAndroid Build Coastguard Worker #include <unistd.h> 17*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_MAC) 18*d9f75844SAndroid Build Coastguard Worker #include <sys/sysctl.h> 19*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_FUCHSIA) 20*d9f75844SAndroid Build Coastguard Worker #include <zircon/syscalls.h> 21*d9f75844SAndroid Build Coastguard Worker #endif 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/logging.h" 24*d9f75844SAndroid Build Coastguard Worker 25*d9f75844SAndroid Build Coastguard Worker namespace internal { DetectNumberOfCores()26*d9f75844SAndroid Build Coastguard Workerstatic int DetectNumberOfCores() { 27*d9f75844SAndroid Build Coastguard Worker int number_of_cores; 28*d9f75844SAndroid Build Coastguard Worker 29*d9f75844SAndroid Build Coastguard Worker #if defined(WEBRTC_WIN) 30*d9f75844SAndroid Build Coastguard Worker SYSTEM_INFO si; 31*d9f75844SAndroid Build Coastguard Worker GetNativeSystemInfo(&si); 32*d9f75844SAndroid Build Coastguard Worker number_of_cores = static_cast<int>(si.dwNumberOfProcessors); 33*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_LINUX) || defined(WEBRTC_ANDROID) 34*d9f75844SAndroid Build Coastguard Worker number_of_cores = static_cast<int>(sysconf(_SC_NPROCESSORS_ONLN)); 35*d9f75844SAndroid Build Coastguard Worker if (number_of_cores <= 0) { 36*d9f75844SAndroid Build Coastguard Worker RTC_LOG(LS_ERROR) << "Failed to get number of cores"; 37*d9f75844SAndroid Build Coastguard Worker number_of_cores = 1; 38*d9f75844SAndroid Build Coastguard Worker } 39*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_MAC) || defined(WEBRTC_IOS) 40*d9f75844SAndroid Build Coastguard Worker int name[] = {CTL_HW, HW_AVAILCPU}; 41*d9f75844SAndroid Build Coastguard Worker size_t size = sizeof(number_of_cores); 42*d9f75844SAndroid Build Coastguard Worker if (0 != sysctl(name, 2, &number_of_cores, &size, NULL, 0)) { 43*d9f75844SAndroid Build Coastguard Worker RTC_LOG(LS_ERROR) << "Failed to get number of cores"; 44*d9f75844SAndroid Build Coastguard Worker number_of_cores = 1; 45*d9f75844SAndroid Build Coastguard Worker } 46*d9f75844SAndroid Build Coastguard Worker #elif defined(WEBRTC_FUCHSIA) 47*d9f75844SAndroid Build Coastguard Worker number_of_cores = zx_system_get_num_cpus(); 48*d9f75844SAndroid Build Coastguard Worker #else 49*d9f75844SAndroid Build Coastguard Worker RTC_LOG(LS_ERROR) << "No function to get number of cores"; 50*d9f75844SAndroid Build Coastguard Worker number_of_cores = 1; 51*d9f75844SAndroid Build Coastguard Worker #endif 52*d9f75844SAndroid Build Coastguard Worker 53*d9f75844SAndroid Build Coastguard Worker RTC_LOG(LS_INFO) << "Available number of cores: " << number_of_cores; 54*d9f75844SAndroid Build Coastguard Worker 55*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_GT(number_of_cores, 0); 56*d9f75844SAndroid Build Coastguard Worker return number_of_cores; 57*d9f75844SAndroid Build Coastguard Worker } 58*d9f75844SAndroid Build Coastguard Worker } // namespace internal 59*d9f75844SAndroid Build Coastguard Worker 60*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 61*d9f75844SAndroid Build Coastguard Worker DetectNumberOfCores()62*d9f75844SAndroid Build Coastguard Workeruint32_t CpuInfo::DetectNumberOfCores() { 63*d9f75844SAndroid Build Coastguard Worker // Statically cache the number of system cores available since if the process 64*d9f75844SAndroid Build Coastguard Worker // is running in a sandbox, we may only be able to read the value once (before 65*d9f75844SAndroid Build Coastguard Worker // the sandbox is initialized) and not thereafter. 66*d9f75844SAndroid Build Coastguard Worker // For more information see crbug.com/176522. 67*d9f75844SAndroid Build Coastguard Worker static const uint32_t logical_cpus = 68*d9f75844SAndroid Build Coastguard Worker static_cast<uint32_t>(internal::DetectNumberOfCores()); 69*d9f75844SAndroid Build Coastguard Worker return logical_cpus; 70*d9f75844SAndroid Build Coastguard Worker } 71*d9f75844SAndroid Build Coastguard Worker 72*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 73