diff --git a/lldb/tools/lldb-perf/lib/Measurement.h b/lldb/tools/lldb-perf/lib/Measurement.h index 24a95bb4b5bc..45e556212db6 100644 --- a/lldb/tools/lldb-perf/lib/Measurement.h +++ b/lldb/tools/lldb-perf/lib/Measurement.h @@ -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 +class MemoryMeasurement : public Measurement +{ +public: + MemoryMeasurement () : Measurement () + {} + + MemoryMeasurement (Action act, const char* name = NULL, const char* descr = NULL) : Measurement (act, name, descr) + {} + + template + MemoryMeasurement (const MemoryMeasurement& rhs) : Measurement(rhs) + {} + + template + MemoryMeasurement (const Measurement& rhs) : Measurement(rhs) + {} + + template + void + operator () (Args... args) + { + Measurement::operator()(args...); + } +}; + } #endif /* defined(__PerfTestDriver__Measurement__) */ diff --git a/lldb/tools/lldb-perf/lib/MemoryGauge.cpp b/lldb/tools/lldb-perf/lib/MemoryGauge.cpp index f12a7fd99cb7..2a6faf2b2abd 100644 --- a/lldb/tools/lldb-perf/lib/MemoryGauge.cpp +++ b/lldb/tools/lldb-perf/lib/MemoryGauge.cpp @@ -8,18 +8,69 @@ #include "MemoryGauge.h" #include +#include #include +#include 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; } diff --git a/lldb/tools/lldb-perf/lib/MemoryGauge.h b/lldb/tools/lldb-perf/lib/MemoryGauge.h index eefd274b9c4f..821245557edb 100644 --- a/lldb/tools/lldb-perf/lib/MemoryGauge.h +++ b/lldb/tools/lldb-perf/lib/MemoryGauge.h @@ -15,7 +15,68 @@ namespace lldb_perf { -class MemoryGauge : public Gauge +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 { private: enum class State diff --git a/lldb/tools/lldb-perf/lib/Metric.cpp b/lldb/tools/lldb-perf/lib/Metric.cpp index ba56c033c154..afacc9b11a4b 100644 --- a/lldb/tools/lldb-perf/lib/Metric.cpp +++ b/lldb/tools/lldb-perf/lib/Metric.cpp @@ -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::description () return m_description.c_str(); } -template -void Metric::WriteImpl (CFCMutableArray& parent, identity) +template <> +void Metric::WriteImpl (CFCMutableArray& parent, identity) { CFCMutableDictionary dict; dict.AddValueCString(CFCString("name").get(),name(), true); @@ -80,15 +81,24 @@ void Metric::WriteImpl (CFCMutableArray& parent, identity) parent.AppendValue(dict.get(), true); } -template -void Metric::WriteImpl (CFCMutableArray& parent, identity) +template <> +void Metric::WriteImpl (CFCMutableArray& parent, identity) { 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; -template class lldb_perf::Metric; +template class lldb_perf::Metric; diff --git a/lldb/tools/lldb-perf/lib/Metric.h b/lldb/tools/lldb-perf/lib/Metric.h index 4d7b57d33cb0..981836c93d86 100644 --- a/lldb/tools/lldb-perf/lib/Metric.h +++ b/lldb/tools/lldb-perf/lib/Metric.h @@ -17,6 +17,7 @@ namespace lldb_perf { +class MemoryStats; class WriteToPList { public: @@ -64,7 +65,7 @@ private: void WriteImpl (CFCMutableArray& parent, identity); - void WriteImpl (CFCMutableArray& parent, identity); + void WriteImpl (CFCMutableArray& parent, identity); std::string m_name; std::string m_description; diff --git a/lldb/tools/lldb-perf/lib/TestCase.h b/lldb/tools/lldb-perf/lib/TestCase.h index 3102d371ad65..733967bb2c99 100644 --- a/lldb/tools/lldb-perf/lib/TestCase.h +++ b/lldb/tools/lldb-perf/lib/TestCase.h @@ -102,6 +102,12 @@ public: return TimeMeasurement (a,name, description); } + template + MemoryMeasurement CreateMemoryMeasurement (A a, const char* name = NULL, const char* description = NULL) + { + return MemoryMeasurement (a,name, description); + } + static void Run (TestCase& test, int argc, const char** argv);