| Index: webrtc/system_wrappers/source/cpu_info.cc
|
| diff --git a/webrtc/system_wrappers/source/cpu_info.cc b/webrtc/system_wrappers/source/cpu_info.cc
|
| index 40231b65afcabf3c356b954a739b71b38f8674be..4a61c7a6f3a00e9fdaf4af4235fb7fce4e98b7de 100644
|
| --- a/webrtc/system_wrappers/source/cpu_info.cc
|
| +++ b/webrtc/system_wrappers/source/cpu_info.cc
|
| @@ -10,12 +10,60 @@
|
|
|
| #include "webrtc/system_wrappers/include/cpu_info.h"
|
|
|
| -#include "webrtc/base/systeminfo.h"
|
| +#if defined(WEBRTC_WIN)
|
| +#include <winsock2.h>
|
| +#include <windows.h>
|
| +#ifndef EXCLUDE_D3D9
|
| +#include <d3d9.h>
|
| +#endif
|
| +#elif defined(WEBRTC_LINUX)
|
| +#include <unistd.h>
|
| +#endif
|
| +#if defined(WEBRTC_MAC)
|
| +#include <sys/sysctl.h>
|
| +#endif
|
| +
|
| +#include "webrtc/base/logging.h"
|
| +
|
| +namespace internal {
|
| +static int DetectNumberOfCores() {
|
| + // We fall back on assuming a single core in case of errors.
|
| + int number_of_cores = 1;
|
| +
|
| +#if defined(WEBRTC_WIN)
|
| + SYSTEM_INFO si;
|
| + GetSystemInfo(&si);
|
| + number_of_cores = static_cast<int>(si.dwNumberOfProcessors);
|
| +#elif defined(WEBRTC_LINUX) || defined(WEBRTC_ANDROID)
|
| + number_of_cores = static_cast<int>(sysconf(_SC_NPROCESSORS_ONLN));
|
| +#elif defined(WEBRTC_MAC)
|
| + int name[] = {CTL_HW, HW_AVAILCPU};
|
| + size_t size = sizeof(number_of_cores);
|
| + if (0 != sysctl(name, 2, &number_of_cores, &size, NULL, 0)) {
|
| + LOG(LS_ERROR) << "Failed to get number of cores";
|
| + number_of_cores = 1;
|
| + }
|
| +#else
|
| + LOG(LS_ERROR) << "No function to get number of cores";
|
| +#endif
|
| +
|
| + LOG(LS_INFO) << "Available number of cores: " << number_of_cores;
|
| +
|
| + return number_of_cores;
|
| +}
|
| +}
|
|
|
| namespace webrtc {
|
|
|
| uint32_t CpuInfo::DetectNumberOfCores() {
|
| - return static_cast<uint32_t>(rtc::SystemInfo::GetMaxCpus());
|
| + // Statically cache the number of system cores available since if the process
|
| + // is running in a sandbox, we may only be able to read the value once (before
|
| + // the sandbox is initialized) and not thereafter.
|
| + // For more information see crbug.com/176522.
|
| + static uint32_t logical_cpus = 0;
|
| + if (!logical_cpus)
|
| + logical_cpus = static_cast<uint32_t>(internal::DetectNumberOfCores());
|
| + return logical_cpus;
|
| }
|
|
|
| } // namespace webrtc
|
|
|