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