TBR=niklas.enbom@webrtc.org Review URL: https://webrtc-codereview.appspot.com/915006 git-svn-id: http://webrtc.googlecode.com/svn/trunk@2963 4adac7df-926f-26a2-2b94-8c16560cd09d
144 lines
3.9 KiB
C++
144 lines
3.9 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 "cpu_mac.h"
|
|
|
|
#include <iostream>
|
|
#include <mach/mach.h>
|
|
#include <mach/mach_error.h>
|
|
|
|
#include "tick_util.h"
|
|
|
|
namespace webrtc {
|
|
CpuWrapperMac::CpuWrapperMac()
|
|
: _cpuCount(0),
|
|
_cpuUsage(NULL),
|
|
_totalCpuUsage(0),
|
|
_lastTickCount(NULL),
|
|
_lastTime(0)
|
|
{
|
|
natural_t cpuCount;
|
|
processor_info_array_t infoArray;
|
|
mach_msg_type_number_t infoCount;
|
|
|
|
kern_return_t error = host_processor_info(mach_host_self(),
|
|
PROCESSOR_CPU_LOAD_INFO,
|
|
&cpuCount,
|
|
&infoArray,
|
|
&infoCount);
|
|
if (error)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_cpuCount = cpuCount;
|
|
_cpuUsage = new WebRtc_UWord32[cpuCount];
|
|
_lastTickCount = new WebRtc_Word64[cpuCount];
|
|
_lastTime = TickTime::MillisecondTimestamp();
|
|
|
|
processor_cpu_load_info_data_t* cpuLoadInfo =
|
|
(processor_cpu_load_info_data_t*) infoArray;
|
|
for (unsigned int cpu= 0; cpu < cpuCount; cpu++)
|
|
{
|
|
WebRtc_Word64 ticks = 0;
|
|
for (int state = 0; state < 2; state++)
|
|
{
|
|
ticks += cpuLoadInfo[cpu].cpu_ticks[state];
|
|
}
|
|
_lastTickCount[cpu] = ticks;
|
|
_cpuUsage[cpu] = 0;
|
|
}
|
|
vm_deallocate(mach_task_self(), (vm_address_t)infoArray, infoCount);
|
|
}
|
|
|
|
CpuWrapperMac::~CpuWrapperMac()
|
|
{
|
|
delete[] _cpuUsage;
|
|
delete[] _lastTickCount;
|
|
}
|
|
|
|
WebRtc_Word32 CpuWrapperMac::CpuUsage()
|
|
{
|
|
WebRtc_UWord32 numCores;
|
|
WebRtc_UWord32* array = NULL;
|
|
return CpuUsageMultiCore(numCores, array);
|
|
}
|
|
|
|
WebRtc_Word32
|
|
CpuWrapperMac::CpuUsageMultiCore(WebRtc_UWord32& numCores,
|
|
WebRtc_UWord32*& array)
|
|
{
|
|
// sanity check
|
|
if(_cpuUsage == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
WebRtc_Word64 now = TickTime::MillisecondTimestamp();
|
|
WebRtc_Word64 timeDiffMS = now - _lastTime;
|
|
if(timeDiffMS >= 500)
|
|
{
|
|
if(Update(timeDiffMS) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
_lastTime = now;
|
|
}
|
|
|
|
numCores = _cpuCount;
|
|
array = _cpuUsage;
|
|
return _totalCpuUsage / _cpuCount;
|
|
}
|
|
|
|
WebRtc_Word32 CpuWrapperMac::Update(WebRtc_Word64 timeDiffMS)
|
|
{
|
|
natural_t cpuCount;
|
|
processor_info_array_t infoArray;
|
|
mach_msg_type_number_t infoCount;
|
|
|
|
kern_return_t error = host_processor_info(mach_host_self(),
|
|
PROCESSOR_CPU_LOAD_INFO,
|
|
&cpuCount,
|
|
&infoArray,
|
|
&infoCount);
|
|
if (error)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
processor_cpu_load_info_data_t* cpuLoadInfo =
|
|
(processor_cpu_load_info_data_t*) infoArray;
|
|
|
|
_totalCpuUsage = 0;
|
|
for (unsigned int cpu = 0; cpu < cpuCount; cpu++)
|
|
{
|
|
WebRtc_Word64 ticks = 0;
|
|
for (int state = 0; state < 2; state++)
|
|
{
|
|
ticks += cpuLoadInfo[cpu].cpu_ticks[state];
|
|
}
|
|
if(timeDiffMS <= 0)
|
|
{
|
|
_cpuUsage[cpu] = 0;
|
|
}else {
|
|
_cpuUsage[cpu] = (WebRtc_UWord32)((1000 *
|
|
(ticks - _lastTickCount[cpu])) /
|
|
timeDiffMS);
|
|
}
|
|
_lastTickCount[cpu] = ticks;
|
|
_totalCpuUsage += _cpuUsage[cpu];
|
|
}
|
|
|
|
vm_deallocate(mach_task_self(), (vm_address_t)infoArray, infoCount);
|
|
|
|
return 0;
|
|
}
|
|
} // namespace webrtc
|