/* * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "system_wrappers/source/cpu_mac.h" #include #include #include #include "tick_util.h" namespace webrtc { CpuWrapperMac::CpuWrapperMac() : cpu_count_(0), cpu_usage_(NULL), total_cpu_usage_(0), last_tick_count_(NULL), last_time_(0) { natural_t cpu_count; processor_info_array_t info_array; mach_msg_type_number_t info_count; kern_return_t error = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &cpu_count, &info_array, &info_count); if (error) { return; } cpu_count_ = cpu_count; cpu_usage_ = new WebRtc_UWord32[cpu_count]; last_tick_count_ = new WebRtc_Word64[cpu_count]; last_time_ = TickTime::MillisecondTimestamp(); processor_cpu_load_info_data_t* cpu_load_info = (processor_cpu_load_info_data_t*) info_array; for (unsigned int cpu = 0; cpu < cpu_count; ++cpu) { WebRtc_Word64 ticks = 0; for (int state = 0; state < 2; ++state) { ticks += cpu_load_info[cpu].cpu_ticks[state]; } last_tick_count_[cpu] = ticks; cpu_usage_[cpu] = 0; } vm_deallocate(mach_task_self(), (vm_address_t)info_array, info_count); } CpuWrapperMac::~CpuWrapperMac() { delete[] cpu_usage_; delete[] last_tick_count_; } WebRtc_Word32 CpuWrapperMac::CpuUsage() { WebRtc_UWord32 num_cores; WebRtc_UWord32* array = NULL; return CpuUsageMultiCore(num_cores, array); } WebRtc_Word32 CpuWrapperMac::CpuUsageMultiCore(WebRtc_UWord32& num_cores, WebRtc_UWord32*& array) { // sanity check if (cpu_usage_ == NULL) { return -1; } WebRtc_Word64 now = TickTime::MillisecondTimestamp(); WebRtc_Word64 time_diff_ms = now - last_time_; if (time_diff_ms >= 500) { if (Update(time_diff_ms) != 0) { return -1; } last_time_ = now; } num_cores = cpu_count_; array = cpu_usage_; return total_cpu_usage_ / cpu_count_; } WebRtc_Word32 CpuWrapperMac::Update(WebRtc_Word64 time_diff_ms) { natural_t cpu_count; processor_info_array_t info_array; mach_msg_type_number_t info_count; kern_return_t error = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &cpu_count, &info_array, &info_count); if (error) { return -1; } processor_cpu_load_info_data_t* cpu_load_info = (processor_cpu_load_info_data_t*) info_array; total_cpu_usage_ = 0; for (unsigned int cpu = 0; cpu < cpu_count; ++cpu) { WebRtc_Word64 ticks = 0; for (int state = 0; state < 2; ++state) { ticks += cpu_load_info[cpu].cpu_ticks[state]; } if (time_diff_ms <= 0) { cpu_usage_[cpu] = 0; } else { cpu_usage_[cpu] = (WebRtc_UWord32)((1000 * (ticks - last_tick_count_[cpu])) / time_diff_ms); } last_tick_count_[cpu] = ticks; total_cpu_usage_ += cpu_usage_[cpu]; } vm_deallocate(mach_task_self(), (vm_address_t)info_array, info_count); return 0; } } // namespace webrtc