Making MemoryGauge work by fixing a Mach API call mistake - saving (and dumping) more information out of the task_info call

llvm-svn: 177580
This commit is contained in:
Enrico Granata 2013-03-20 21:18:20 +00:00
parent c77e9440cf
commit f3fb83ac6b
6 changed files with 167 additions and 11 deletions

View File

@ -12,6 +12,7 @@
#include "Gauge.h"
#include "Timer.h"
#include "Metric.h"
#include "MemoryGauge.h"
namespace lldb_perf
{
@ -90,6 +91,32 @@ public:
}
};
template <typename Action>
class MemoryMeasurement : public Measurement<MemoryGauge,Action>
{
public:
MemoryMeasurement () : Measurement<MemoryGauge,Action> ()
{}
MemoryMeasurement (Action act, const char* name = NULL, const char* descr = NULL) : Measurement<MemoryGauge,Action> (act, name, descr)
{}
template <typename Action_Rhs>
MemoryMeasurement (const MemoryMeasurement<Action_Rhs>& rhs) : Measurement<MemoryGauge,Action>(rhs)
{}
template <typename GaugeType_Rhs, typename Action_Rhs>
MemoryMeasurement (const Measurement<GaugeType_Rhs, Action_Rhs>& rhs) : Measurement<GaugeType_Rhs,Action_Rhs>(rhs)
{}
template <typename... Args>
void
operator () (Args... args)
{
Measurement<MemoryGauge,Action>::operator()(args...);
}
};
}
#endif /* defined(__PerfTestDriver__Measurement__) */

View File

@ -8,18 +8,69 @@
#include "MemoryGauge.h"
#include <assert.h>
#include <mach/mach.h>
#include <mach/task.h>
#include <mach/mach_traps.h>
using namespace lldb_perf;
MemoryStats::MemoryStats () : MemoryStats(0,0,0) {}
MemoryStats::MemoryStats (mach_vm_size_t vs,mach_vm_size_t rs, mach_vm_size_t mrs) :
m_virtual_size(vs),
m_resident_size(rs),
m_max_resident_size(mrs)
{}
MemoryStats::MemoryStats (const MemoryStats& rhs) : MemoryStats(rhs.m_virtual_size,rhs.m_resident_size,rhs.m_max_resident_size)
{}
MemoryStats&
MemoryStats::operator = (const MemoryStats& rhs)
{
if (&rhs != this)
{
m_virtual_size = rhs.m_virtual_size;
m_resident_size = rhs.m_resident_size;
m_max_resident_size = rhs.m_max_resident_size;
}
return *this;
}
MemoryStats&
MemoryStats::operator += (const MemoryStats& rhs)
{
m_virtual_size += rhs.m_virtual_size;
m_resident_size += rhs.m_resident_size;
m_max_resident_size += rhs.m_max_resident_size;
return *this;
}
MemoryStats
MemoryStats::operator - (const MemoryStats& rhs)
{
return MemoryStats(m_virtual_size - rhs.m_virtual_size,
m_resident_size - rhs.m_resident_size,
m_max_resident_size - rhs.m_max_resident_size);
}
MemoryStats&
MemoryStats::operator / (size_t rhs)
{
m_virtual_size /= rhs;
m_resident_size /= rhs;
m_max_resident_size /= rhs;
return *this;
}
MemoryGauge::SizeType
MemoryGauge::now ()
{
task_t task = MACH_PORT_NULL;
task_t task = mach_task_self();
mach_task_basic_info_data_t taskBasicInfo;
mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT;
if (task_info(task, MACH_TASK_BASIC_INFO, (task_info_t) & taskBasicInfo, &count) == KERN_SUCCESS) {
return taskBasicInfo.virtual_size;
auto task_info_ret = task_info(task, MACH_TASK_BASIC_INFO, (task_info_t) & taskBasicInfo, &count);
if (task_info_ret == KERN_SUCCESS) {
return MemoryStats(taskBasicInfo.virtual_size, taskBasicInfo.resident_size, taskBasicInfo.resident_size_max);
}
return 0;
}

View File

@ -15,7 +15,68 @@
namespace lldb_perf
{
class MemoryGauge : public Gauge<mach_vm_size_t>
class MemoryStats
{
public:
MemoryStats ();
MemoryStats (mach_vm_size_t,mach_vm_size_t = 0, mach_vm_size_t = 0);
MemoryStats (const MemoryStats& rhs);
MemoryStats&
operator = (const MemoryStats& rhs);
MemoryStats&
operator += (const MemoryStats& rhs);
MemoryStats
operator - (const MemoryStats& rhs);
MemoryStats&
operator / (size_t rhs);
mach_vm_size_t
GetVirtualSize ()
{
return m_virtual_size;
}
mach_vm_size_t
GetResidentSize ()
{
return m_resident_size;
}
mach_vm_size_t
GetMaxResidentSize ()
{
return m_max_resident_size;
}
void
SetVirtualSize (mach_vm_size_t vs)
{
m_virtual_size = vs;
}
void
SetResidentSize (mach_vm_size_t rs)
{
m_resident_size = rs;
}
void
SetMaxResidentSize (mach_vm_size_t mrs)
{
m_max_resident_size = mrs;
}
private:
mach_vm_size_t m_virtual_size;
mach_vm_size_t m_resident_size;
mach_vm_size_t m_max_resident_size;
};
class MemoryGauge : public Gauge<MemoryStats>
{
private:
enum class State

View File

@ -11,6 +11,7 @@
#include "CFCMutableArray.h"
#include "CFCMutableDictionary.h"
#include "CFCString.h"
#include "MemoryGauge.h"
using namespace lldb_perf;
@ -70,8 +71,8 @@ Metric<T>::description ()
return m_description.c_str();
}
template <class T>
void Metric<T>::WriteImpl (CFCMutableArray& parent, identity<double>)
template <>
void Metric<double>::WriteImpl (CFCMutableArray& parent, identity<double>)
{
CFCMutableDictionary dict;
dict.AddValueCString(CFCString("name").get(),name(), true);
@ -80,15 +81,24 @@ void Metric<T>::WriteImpl (CFCMutableArray& parent, identity<double>)
parent.AppendValue(dict.get(), true);
}
template <class T>
void Metric<T>::WriteImpl (CFCMutableArray& parent, identity<mach_vm_size_t>)
template <>
void Metric<MemoryStats>::WriteImpl (CFCMutableArray& parent, identity<MemoryStats>)
{
CFCMutableDictionary dict;
dict.AddValueCString(CFCString("name").get(),name(), true);
dict.AddValueCString(CFCString("description").get(),description(), true);
dict.AddValueUInt64(CFCString("value").get(),this->average(), true);
CFCMutableDictionary value;
auto avg = this->average();
value.AddValueUInt64(CFCString("virtual").get(), avg.GetVirtualSize(), true);
value.AddValueUInt64(CFCString("resident").get(), avg.GetResidentSize(), true);
value.AddValueUInt64(CFCString("max_resident").get(), avg.GetMaxResidentSize(), true);
dict.AddValue(CFCString("value").get(),value.get(), true);
parent.AppendValue(dict.get(), true);
}
template class lldb_perf::Metric<double>;
template class lldb_perf::Metric<mach_vm_size_t>;
template class lldb_perf::Metric<MemoryStats>;

View File

@ -17,6 +17,7 @@
namespace lldb_perf
{
class MemoryStats;
class WriteToPList
{
public:
@ -64,7 +65,7 @@ private:
void WriteImpl (CFCMutableArray& parent, identity<double>);
void WriteImpl (CFCMutableArray& parent, identity<mach_vm_size_t>);
void WriteImpl (CFCMutableArray& parent, identity<MemoryStats>);
std::string m_name;
std::string m_description;

View File

@ -102,6 +102,12 @@ public:
return TimeMeasurement<A> (a,name, description);
}
template <typename A>
MemoryMeasurement<A> CreateMemoryMeasurement (A a, const char* name = NULL, const char* description = NULL)
{
return MemoryMeasurement<A> (a,name, description);
}
static void
Run (TestCase& test, int argc, const char** argv);