diff options
author | Yabin Cui <yabinc@google.com> | 2021-12-21 15:47:05 -0800 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2021-12-21 15:47:05 -0800 |
commit | 2da26a0ae9098d056d1767691a09c4db220a73ed (patch) | |
tree | adc0097b0b4525e39925a36d4235fbdb98119063 | |
parent | 1b9df9c4a46341a1c5342fdcbc10acd8138ac5de (diff) | |
download | extras-2da26a0ae9098d056d1767691a09c4db220a73ed.tar.gz |
simpleperf: use std::function for display function.
So we can provide display functions that take some information.
Bug: 211001574
Test: run simpleperf_unit_test
Change-Id: I59dbf3c59e0e42633e1903ae5fca8d9a6e23b34c
-rw-r--r-- | simpleperf/SampleDisplayer.h | 11 | ||||
-rw-r--r-- | simpleperf/cmd_kmem.cpp | 15 | ||||
-rw-r--r-- | simpleperf/cmd_report.cpp | 40 |
3 files changed, 34 insertions, 32 deletions
diff --git a/simpleperf/SampleDisplayer.h b/simpleperf/SampleDisplayer.h index a6aceefb..d8390ef8 100644 --- a/simpleperf/SampleDisplayer.h +++ b/simpleperf/SampleDisplayer.h @@ -185,8 +185,8 @@ class CallgraphDisplayer { template <typename EntryT, typename InfoT> class SampleDisplayer { public: - typedef std::string (*display_sample_func_t)(const EntryT*); - typedef std::string (*display_sample_with_info_func_t)(const EntryT*, const InfoT*); + using display_sample_func_t = std::function<std::string(const EntryT*)>; + using display_sample_with_info_func_t = std::function<std::string(const EntryT*, const InfoT*)>; using exclusive_display_sample_func_t = std::function<void(FILE*, const EntryT*)>; private: @@ -207,7 +207,7 @@ class SampleDisplayer { filter_func_ = filter; } - void AddDisplayFunction(const std::string& name, display_sample_func_t func) { + void AddDisplayFunction(const std::string& name, const display_sample_func_t& func) { Item item; item.name = name; item.width = name.size(); @@ -216,7 +216,8 @@ class SampleDisplayer { display_v_.push_back(item); } - void AddDisplayFunction(const std::string& name, display_sample_with_info_func_t func_with_info) { + void AddDisplayFunction(const std::string& name, + const display_sample_with_info_func_t& func_with_info) { Item item; item.name = name; item.width = name.size(); @@ -225,7 +226,7 @@ class SampleDisplayer { display_v_.push_back(item); } - void AddExclusiveDisplayFunction(exclusive_display_sample_func_t func) { + void AddExclusiveDisplayFunction(const exclusive_display_sample_func_t& func) { exclusive_display_v_.push_back(func); } diff --git a/simpleperf/cmd_kmem.cpp b/simpleperf/cmd_kmem.cpp index 10eb5c9e..c756eb3a 100644 --- a/simpleperf/cmd_kmem.cpp +++ b/simpleperf/cmd_kmem.cpp @@ -493,28 +493,29 @@ bool KmemCommand::PrepareToBuildSampleTree() { for (const auto& key : slab_sort_keys_) { if (key == "hit") { sort_comparator.AddCompareFunction(CompareSampleCount); - displayer.AddDisplayFunction(accumulated_name + "Hit", DisplaySampleCount); + displayer.AddDisplayFunction(accumulated_name + "Hit", DisplaySampleCount<SlabSample>); } else if (key == "caller") { comparator.AddCompareFunction(CompareSymbol); - displayer.AddDisplayFunction("Caller", DisplaySymbol); + displayer.AddDisplayFunction("Caller", DisplaySymbol<SlabSample>); } else if (key == "ptr") { comparator.AddCompareFunction(ComparePtr); - displayer.AddDisplayFunction("Ptr", DisplayPtr); + displayer.AddDisplayFunction("Ptr", DisplayPtr<SlabSample>); } else if (key == "bytes_req") { sort_comparator.AddCompareFunction(CompareBytesReq); - displayer.AddDisplayFunction(accumulated_name + "BytesReq", DisplayBytesReq); + displayer.AddDisplayFunction(accumulated_name + "BytesReq", DisplayBytesReq<SlabSample>); } else if (key == "bytes_alloc") { sort_comparator.AddCompareFunction(CompareBytesAlloc); - displayer.AddDisplayFunction(accumulated_name + "BytesAlloc", DisplayBytesAlloc); + displayer.AddDisplayFunction(accumulated_name + "BytesAlloc", + DisplayBytesAlloc<SlabSample>); } else if (key == "fragment") { sort_comparator.AddCompareFunction(CompareFragment); displayer.AddDisplayFunction(accumulated_name + "Fragment", DisplayFragment); } else if (key == "gfp_flags") { comparator.AddCompareFunction(CompareGfpFlags); - displayer.AddDisplayFunction("GfpFlags", DisplayGfpFlags); + displayer.AddDisplayFunction("GfpFlags", DisplayGfpFlags<SlabSample>); } else if (key == "pingpong") { sort_comparator.AddCompareFunction(CompareCrossCpuAllocations); - displayer.AddDisplayFunction("Pingpong", DisplayCrossCpuAllocations); + displayer.AddDisplayFunction("Pingpong", DisplayCrossCpuAllocations<SlabSample>); } else { LOG(ERROR) << "Unknown sort key for slab allocation: " << key; return false; diff --git a/simpleperf/cmd_report.cpp b/simpleperf/cmd_report.cpp index eddedbc2..55b543be 100644 --- a/simpleperf/cmd_report.cpp +++ b/simpleperf/cmd_report.cpp @@ -649,21 +649,21 @@ bool ReportCommand::BuildSampleComparatorAndDisplayer(bool print_sample_count, if (accumulate_callchain_) { if (raw_period_) { - displayer.AddDisplayFunction("Children", DisplayAccumulatedPeriod); - displayer.AddDisplayFunction("Self", DisplaySelfPeriod); + displayer.AddDisplayFunction("Children", DisplayAccumulatedPeriod<SampleEntry>); + displayer.AddDisplayFunction("Self", DisplaySelfPeriod<SampleEntry>); } else { - displayer.AddDisplayFunction("Children", DisplayAccumulatedOverhead); - displayer.AddDisplayFunction("Self", DisplaySelfOverhead); + displayer.AddDisplayFunction("Children", DisplayAccumulatedOverhead<SampleEntry, SampleTree>); + displayer.AddDisplayFunction("Self", DisplaySelfOverhead<SampleEntry, SampleTree>); } } else { if (raw_period_) { - displayer.AddDisplayFunction("Overhead", DisplaySelfPeriod); + displayer.AddDisplayFunction("Overhead", DisplaySelfPeriod<SampleEntry>); } else { - displayer.AddDisplayFunction("Overhead", DisplaySelfOverhead); + displayer.AddDisplayFunction("Overhead", DisplaySelfOverhead<SampleEntry, SampleTree>); } } if (print_sample_count) { - displayer.AddDisplayFunction("Sample", DisplaySampleCount); + displayer.AddDisplayFunction("Sample", DisplaySampleCount<SampleEntry>); } for (auto& key : sort_keys) { @@ -673,34 +673,34 @@ bool ReportCommand::BuildSampleComparatorAndDisplayer(bool print_sample_count, } if (key == "pid") { comparator.AddCompareFunction(ComparePid); - displayer.AddDisplayFunction("Pid", DisplayPid); + displayer.AddDisplayFunction("Pid", DisplayPid<SampleEntry>); } else if (key == "tid") { comparator.AddCompareFunction(CompareTid); - displayer.AddDisplayFunction("Tid", DisplayTid); + displayer.AddDisplayFunction("Tid", DisplayTid<SampleEntry>); } else if (key == "comm") { comparator.AddCompareFunction(CompareComm); - displayer.AddDisplayFunction("Command", DisplayComm); + displayer.AddDisplayFunction("Command", DisplayComm<SampleEntry>); } else if (key == "dso") { comparator.AddCompareFunction(CompareDso); - displayer.AddDisplayFunction("Shared Object", DisplayDso); + displayer.AddDisplayFunction("Shared Object", DisplayDso<SampleEntry>); } else if (key == "symbol") { comparator.AddCompareFunction(CompareSymbol); - displayer.AddDisplayFunction("Symbol", DisplaySymbol); + displayer.AddDisplayFunction("Symbol", DisplaySymbol<SampleEntry>); } else if (key == "vaddr_in_file") { comparator.AddCompareFunction(CompareVaddrInFile); - displayer.AddDisplayFunction("VaddrInFile", DisplayVaddrInFile); + displayer.AddDisplayFunction("VaddrInFile", DisplayVaddrInFile<SampleEntry>); } else if (key == "dso_from") { comparator.AddCompareFunction(CompareDsoFrom); - displayer.AddDisplayFunction("Source Shared Object", DisplayDsoFrom); + displayer.AddDisplayFunction("Source Shared Object", DisplayDsoFrom<SampleEntry>); } else if (key == "dso_to") { comparator.AddCompareFunction(CompareDso); - displayer.AddDisplayFunction("Target Shared Object", DisplayDso); + displayer.AddDisplayFunction("Target Shared Object", DisplayDso<SampleEntry>); } else if (key == "symbol_from") { comparator.AddCompareFunction(CompareSymbolFrom); - displayer.AddDisplayFunction("Source Symbol", DisplaySymbolFrom); + displayer.AddDisplayFunction("Source Symbol", DisplaySymbolFrom<SampleEntry>); } else if (key == "symbol_to") { comparator.AddCompareFunction(CompareSymbol); - displayer.AddDisplayFunction("Target Symbol", DisplaySymbol); + displayer.AddDisplayFunction("Target Symbol", DisplaySymbol<SampleEntry>); } else { LOG(ERROR) << "Unknown sort key: " << key; return false; @@ -709,10 +709,10 @@ bool ReportCommand::BuildSampleComparatorAndDisplayer(bool print_sample_count, if (report_csv_) { if (accumulate_callchain_) { - displayer.AddDisplayFunction("AccEventCount", DisplayAccumulatedPeriod); - displayer.AddDisplayFunction("SelfEventCount", DisplaySelfPeriod); + displayer.AddDisplayFunction("AccEventCount", DisplayAccumulatedPeriod<SampleEntry>); + displayer.AddDisplayFunction("SelfEventCount", DisplaySelfPeriod<SampleEntry>); } else { - displayer.AddDisplayFunction("EventCount", DisplaySelfPeriod); + displayer.AddDisplayFunction("EventCount", DisplaySelfPeriod<SampleEntry>); } displayer.AddDisplayFunction("EventName", DisplayEventName); } |