
BUG= Review URL: https://webrtc-codereview.appspot.com/930025 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3142 4adac7df-926f-26a2-2b94-8c16560cd09d
131 lines
3.7 KiB
C++
131 lines
3.7 KiB
C++
/*
|
|
* 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 <iostream>
|
|
#include <mach/mach.h>
|
|
#include <mach/mach_error.h>
|
|
|
|
#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
|