1c55a96383497a772a307b346368133960b02ad03Eric Laurent/* 2c55a96383497a772a307b346368133960b02ad03Eric Laurent * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3c55a96383497a772a307b346368133960b02ad03Eric Laurent * 4c55a96383497a772a307b346368133960b02ad03Eric Laurent * Use of this source code is governed by a BSD-style license 5c55a96383497a772a307b346368133960b02ad03Eric Laurent * that can be found in the LICENSE file in the root of the source 6c55a96383497a772a307b346368133960b02ad03Eric Laurent * tree. An additional intellectual property rights grant can be found 7c55a96383497a772a307b346368133960b02ad03Eric Laurent * in the file PATENTS. All contributing project authors may 8c55a96383497a772a307b346368133960b02ad03Eric Laurent * be found in the AUTHORS file in the root of the source tree. 9c55a96383497a772a307b346368133960b02ad03Eric Laurent */ 10c55a96383497a772a307b346368133960b02ad03Eric Laurent 11c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "cpu_info.h" 12c55a96383497a772a307b346368133960b02ad03Eric Laurent 13c55a96383497a772a307b346368133960b02ad03Eric Laurent#if defined(_WIN32) 14c55a96383497a772a307b346368133960b02ad03Eric Laurent#include <Windows.h> 15c55a96383497a772a307b346368133960b02ad03Eric Laurent#elif defined(WEBRTC_MAC) 16c55a96383497a772a307b346368133960b02ad03Eric Laurent#include <sys/types.h> 17c55a96383497a772a307b346368133960b02ad03Eric Laurent#include <sys/sysctl.h> 18c55a96383497a772a307b346368133960b02ad03Eric Laurent#elif defined(WEBRTC_MAC_INTEL) 19c55a96383497a772a307b346368133960b02ad03Eric Laurent// Intentionally empty 20c55a96383497a772a307b346368133960b02ad03Eric Laurent#elif defined(WEBRTC_ANDROID) 21c55a96383497a772a307b346368133960b02ad03Eric Laurent// Not implemented yet, might be possible to use Linux implementation 22c55a96383497a772a307b346368133960b02ad03Eric Laurent#else // defined(WEBRTC_LINUX) 23c55a96383497a772a307b346368133960b02ad03Eric Laurent#include <sys/sysinfo.h> 24c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif 25c55a96383497a772a307b346368133960b02ad03Eric Laurent 26c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "trace.h" 27c55a96383497a772a307b346368133960b02ad03Eric Laurent 28c55a96383497a772a307b346368133960b02ad03Eric Laurentnamespace webrtc { 29c55a96383497a772a307b346368133960b02ad03Eric Laurent 30c55a96383497a772a307b346368133960b02ad03Eric LaurentWebRtc_UWord32 CpuInfo::_numberOfCores = 0; 31c55a96383497a772a307b346368133960b02ad03Eric Laurent 32c55a96383497a772a307b346368133960b02ad03Eric LaurentWebRtc_UWord32 CpuInfo::DetectNumberOfCores() 33c55a96383497a772a307b346368133960b02ad03Eric Laurent{ 34c55a96383497a772a307b346368133960b02ad03Eric Laurent if (!_numberOfCores) 35c55a96383497a772a307b346368133960b02ad03Eric Laurent { 36c55a96383497a772a307b346368133960b02ad03Eric Laurent#if defined(_WIN32) 37c55a96383497a772a307b346368133960b02ad03Eric Laurent SYSTEM_INFO si; 38c55a96383497a772a307b346368133960b02ad03Eric Laurent GetSystemInfo(&si); 39c55a96383497a772a307b346368133960b02ad03Eric Laurent _numberOfCores = static_cast<WebRtc_UWord32>(si.dwNumberOfProcessors); 40c55a96383497a772a307b346368133960b02ad03Eric Laurent WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, 41c55a96383497a772a307b346368133960b02ad03Eric Laurent "Available number of cores:%d", _numberOfCores); 42c55a96383497a772a307b346368133960b02ad03Eric Laurent 43c55a96383497a772a307b346368133960b02ad03Eric Laurent#elif defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) 44c55a96383497a772a307b346368133960b02ad03Eric Laurent _numberOfCores = get_nprocs(); 45c55a96383497a772a307b346368133960b02ad03Eric Laurent WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, 46c55a96383497a772a307b346368133960b02ad03Eric Laurent "Available number of cores:%d", _numberOfCores); 47c55a96383497a772a307b346368133960b02ad03Eric Laurent 48c55a96383497a772a307b346368133960b02ad03Eric Laurent#elif (defined(WEBRTC_MAC) || defined(WEBRTC_MAC_INTEL)) 49c55a96383497a772a307b346368133960b02ad03Eric Laurent int name[] = {CTL_HW, HW_AVAILCPU}; 50c55a96383497a772a307b346368133960b02ad03Eric Laurent int ncpu; 51c55a96383497a772a307b346368133960b02ad03Eric Laurent size_t size = sizeof(ncpu); 52c55a96383497a772a307b346368133960b02ad03Eric Laurent if(0 == sysctl(name, 2, &ncpu, &size, NULL, 0)) 53c55a96383497a772a307b346368133960b02ad03Eric Laurent { 54c55a96383497a772a307b346368133960b02ad03Eric Laurent _numberOfCores = static_cast<WebRtc_UWord32>(ncpu); 55c55a96383497a772a307b346368133960b02ad03Eric Laurent WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, 56c55a96383497a772a307b346368133960b02ad03Eric Laurent "Available number of cores:%d", _numberOfCores); 57c55a96383497a772a307b346368133960b02ad03Eric Laurent } else 58c55a96383497a772a307b346368133960b02ad03Eric Laurent { 59c55a96383497a772a307b346368133960b02ad03Eric Laurent WEBRTC_TRACE(kTraceError, kTraceUtility, -1, 60c55a96383497a772a307b346368133960b02ad03Eric Laurent "Failed to get number of cores"); 61c55a96383497a772a307b346368133960b02ad03Eric Laurent _numberOfCores = 1; 62c55a96383497a772a307b346368133960b02ad03Eric Laurent } 63c55a96383497a772a307b346368133960b02ad03Eric Laurent#else 64c55a96383497a772a307b346368133960b02ad03Eric Laurent WEBRTC_TRACE(kTraceWarning, kTraceUtility, -1, 65c55a96383497a772a307b346368133960b02ad03Eric Laurent "No function to get number of cores"); 66c55a96383497a772a307b346368133960b02ad03Eric Laurent _numberOfCores = 1; 67c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif 68c55a96383497a772a307b346368133960b02ad03Eric Laurent } 69c55a96383497a772a307b346368133960b02ad03Eric Laurent return _numberOfCores; 70c55a96383497a772a307b346368133960b02ad03Eric Laurent} 71c55a96383497a772a307b346368133960b02ad03Eric Laurent 72c55a96383497a772a307b346368133960b02ad03Eric Laurent} // namespace webrtc 73