diff options
author | Yabin Cui <yabinc@google.com> | 2015-07-31 18:40:09 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2015-07-31 18:43:05 -0700 |
commit | 5872ac6f1f5b804ffea38ff59025441618802d6b (patch) | |
tree | 1ddb8c2c99b10c0847239e194918b96deeed6ad7 | |
parent | 9c6eab9a5bb7c979488dcfe7ea71a039e6a369fb (diff) | |
download | extras-5872ac6f1f5b804ffea38ff59025441618802d6b.tar.gz |
Simpleperf: correct the event type name printed in stat command.
Bug: 22884977
Change-Id: I3c4f5c8dc02d5b17f5942e4e98476d1c4f3fbcad
-rw-r--r-- | simpleperf/cmd_record.cpp | 9 | ||||
-rw-r--r-- | simpleperf/cmd_stat.cpp | 27 | ||||
-rw-r--r-- | simpleperf/event_selection_set.cpp | 25 | ||||
-rw-r--r-- | simpleperf/event_selection_set.h | 11 | ||||
-rw-r--r-- | simpleperf/event_type.cpp | 11 | ||||
-rw-r--r-- | simpleperf/event_type.h | 1 |
6 files changed, 41 insertions, 43 deletions
diff --git a/simpleperf/cmd_record.cpp b/simpleperf/cmd_record.cpp index e4f1d418..060d22c2 100644 --- a/simpleperf/cmd_record.cpp +++ b/simpleperf/cmd_record.cpp @@ -200,9 +200,8 @@ bool RecordCommand::Run(const std::vector<std::string>& args) { // 4. Open record file writer, and dump kernel/modules/threads mmap information. record_file_writer_ = RecordFileWriter::CreateInstance( - record_filename_, - event_selection_set_.FindEventAttrByType(measured_event_type_modifier_->event_type), - event_selection_set_.FindEventFdsByType(measured_event_type_modifier_->event_type)); + record_filename_, event_selection_set_.FindEventAttrByType(*measured_event_type_modifier_), + event_selection_set_.FindEventFdsByType(*measured_event_type_modifier_)); if (record_file_writer_ == nullptr) { return false; } @@ -413,7 +412,7 @@ bool RecordCommand::DumpKernelAndModuleMmaps() { return false; } const perf_event_attr& attr = - event_selection_set_.FindEventAttrByType(measured_event_type_modifier_->event_type); + event_selection_set_.FindEventAttrByType(*measured_event_type_modifier_); MmapRecord mmap_record = CreateMmapRecord(attr, true, UINT_MAX, 0, kernel_mmap.start_addr, kernel_mmap.len, kernel_mmap.pgoff, kernel_mmap.name); if (!record_file_writer_->WriteData(mmap_record.BinaryFormat())) { @@ -452,7 +451,7 @@ bool RecordCommand::DumpThreadCommAndMmaps(bool all_threads, } const perf_event_attr& attr = - event_selection_set_.FindEventAttrByType(measured_event_type_modifier_->event_type); + event_selection_set_.FindEventAttrByType(*measured_event_type_modifier_); // Dump processes. for (auto& thread : thread_comms) { diff --git a/simpleperf/cmd_stat.cpp b/simpleperf/cmd_stat.cpp index d4b19239..6358f502 100644 --- a/simpleperf/cmd_stat.cpp +++ b/simpleperf/cmd_stat.cpp @@ -80,14 +80,15 @@ class StatCommand : public Command { bool AddMeasuredEventType(const std::string& event_type_name); bool AddDefaultMeasuredEventTypes(); bool SetEventSelection(); - bool ShowCounters(const std::map<const EventType*, std::vector<PerfCounter>>& counters_map, - std::chrono::steady_clock::duration counting_duration); + bool ShowCounters( + const std::map<const EventTypeAndModifier*, std::vector<PerfCounter>>& counters_map, + std::chrono::steady_clock::duration counting_duration); bool verbose_mode_; bool system_wide_collection_; bool child_inherit_; std::vector<pid_t> monitored_threads_; - std::vector<std::pair<std::string, EventTypeAndModifier>> measured_event_types_; + std::vector<EventTypeAndModifier> measured_event_types_; EventSelectionSet event_selection_set_; std::unique_ptr<SignalHandlerRegister> signal_handler_register_; @@ -153,7 +154,7 @@ bool StatCommand::Run(const std::vector<std::string>& args) { auto end_time = std::chrono::steady_clock::now(); // 5. Read and print counters. - std::map<const EventType*, std::vector<PerfCounter>> counters_map; + std::map<const EventTypeAndModifier*, std::vector<PerfCounter>> counters_map; if (!event_selection_set_.ReadCounters(&counters_map)) { return false; } @@ -224,7 +225,7 @@ bool StatCommand::AddMeasuredEventType(const std::string& event_type_name) { if (event_type_modifier == nullptr) { return false; } - measured_event_types_.push_back(std::make_pair(event_type_name, *event_type_modifier)); + measured_event_types_.push_back(*event_type_modifier); return true; } @@ -244,8 +245,8 @@ bool StatCommand::AddDefaultMeasuredEventTypes() { } bool StatCommand::SetEventSelection() { - for (auto& pair : measured_event_types_) { - if (!event_selection_set_.AddEventType(pair.second)) { + for (auto& event_type : measured_event_types_) { + if (!event_selection_set_.AddEventType(event_type)) { return false; } } @@ -254,12 +255,12 @@ bool StatCommand::SetEventSelection() { } bool StatCommand::ShowCounters( - const std::map<const EventType*, std::vector<PerfCounter>>& counters_map, + const std::map<const EventTypeAndModifier*, std::vector<PerfCounter>>& counters_map, std::chrono::steady_clock::duration counting_duration) { printf("Performance counter statistics:\n\n"); for (auto& pair : counters_map) { - auto& event_type = pair.first; + auto& event_type_modifier = pair.first; auto& counters = pair.second; if (verbose_mode_) { for (auto& counter : counters) { @@ -288,14 +289,8 @@ bool StatCommand::ShowCounters( sum_counter.time_enabled / sum_counter.time_running); } } - std::string event_type_name; - for (auto& pair : measured_event_types_) { - if (pair.second.event_type.name == event_type->name) { - event_type_name = pair.first; - } - } printf("%'30" PRId64 "%s %s\n", scaled_count, scaled ? "(scaled)" : " ", - event_type_name.c_str()); + event_type_modifier->name.c_str()); } printf("\nTotal test time: %lf seconds.\n", std::chrono::duration_cast<std::chrono::duration<double>>(counting_duration).count()); diff --git a/simpleperf/event_selection_set.cpp b/simpleperf/event_selection_set.cpp index 9d09b06a..555246e6 100644 --- a/simpleperf/event_selection_set.cpp +++ b/simpleperf/event_selection_set.cpp @@ -50,7 +50,7 @@ bool IsDwarfCallChainSamplingSupported() { bool EventSelectionSet::AddEventType(const EventTypeAndModifier& event_type_modifier) { EventSelection selection; - selection.event_type = event_type_modifier.event_type; + selection.event_type_modifier = event_type_modifier; selection.event_attr = CreateDefaultPerfEventAttr(event_type_modifier.event_type); selection.event_attr.exclude_user = event_type_modifier.exclude_user; selection.event_attr.exclude_kernel = event_type_modifier.exclude_kernel; @@ -59,7 +59,7 @@ bool EventSelectionSet::AddEventType(const EventTypeAndModifier& event_type_modi selection.event_attr.exclude_guest = event_type_modifier.exclude_guest; selection.event_attr.precise_ip = event_type_modifier.precise_ip; if (!IsEventAttrSupportedByKernel(selection.event_attr)) { - LOG(ERROR) << "Event type '" << selection.event_type.name << "' is not supported by the kernel"; + LOG(ERROR) << "Event type '" << event_type_modifier.name << "' is not supported by the kernel"; return false; } selections_.push_back(std::move(selection)); @@ -184,8 +184,8 @@ bool EventSelectionSet::OpenEventFiles(const std::vector<pid_t>& threads, // As the online cpus can be enabled or disabled at runtime, we may not open event file for // all cpus successfully. But we should open at least one cpu successfully. if (open_per_thread == 0) { - PLOG(ERROR) << "failed to open perf event file for event_type " << selection.event_type.name - << " for " + PLOG(ERROR) << "failed to open perf event file for event_type " + << selection.event_type_modifier.name << " for " << (tid == -1 ? "all threads" : android::base::StringPrintf(" thread %d", tid)); return false; } @@ -206,7 +206,7 @@ bool EventSelectionSet::EnableEvents() { } bool EventSelectionSet::ReadCounters( - std::map<const EventType*, std::vector<PerfCounter>>* counters_map) { + std::map<const EventTypeAndModifier*, std::vector<PerfCounter>>* counters_map) { for (auto& selection : selections_) { std::vector<PerfCounter> counters; for (auto& event_fd : selection.event_fds) { @@ -216,7 +216,7 @@ bool EventSelectionSet::ReadCounters( } counters.push_back(counter); } - counters_map->insert(std::make_pair(&selection.event_type, counters)); + counters_map->insert(std::make_pair(&selection.event_type_modifier, counters)); } return true; } @@ -290,20 +290,21 @@ std::string EventSelectionSet::FindEventFileNameById(uint64_t id) { } EventSelectionSet::EventSelection* EventSelectionSet::FindSelectionByType( - const EventType& event_type) { + const EventTypeAndModifier& event_type_modifier) { for (auto& selection : selections_) { - if (selection.event_type.name == event_type.name) { + if (selection.event_type_modifier.name == event_type_modifier.name) { return &selection; } } return nullptr; } -const perf_event_attr& EventSelectionSet::FindEventAttrByType(const EventType& event_type) { - return FindSelectionByType(event_type)->event_attr; +const perf_event_attr& EventSelectionSet::FindEventAttrByType( + const EventTypeAndModifier& event_type_modifier) { + return FindSelectionByType(event_type_modifier)->event_attr; } const std::vector<std::unique_ptr<EventFd>>& EventSelectionSet::FindEventFdsByType( - const EventType& event_type) { - return FindSelectionByType(event_type)->event_fds; + const EventTypeAndModifier& event_type_modifier) { + return FindSelectionByType(event_type_modifier)->event_fds; } diff --git a/simpleperf/event_selection_set.h b/simpleperf/event_selection_set.h index 229b4247..afde0af0 100644 --- a/simpleperf/event_selection_set.h +++ b/simpleperf/event_selection_set.h @@ -62,24 +62,25 @@ class EventSelectionSet { bool OpenEventFilesForThreads(const std::vector<pid_t>& threads); bool OpenEventFilesForThreadsOnAllCpus(const std::vector<pid_t>& threads); bool EnableEvents(); - bool ReadCounters(std::map<const EventType*, std::vector<PerfCounter>>* counters_map); + bool ReadCounters(std::map<const EventTypeAndModifier*, std::vector<PerfCounter>>* counters_map); void PreparePollForEventFiles(std::vector<pollfd>* pollfds); bool MmapEventFiles(size_t mmap_pages); bool ReadMmapEventData(std::function<bool(const char*, size_t)> callback); std::string FindEventFileNameById(uint64_t id); - const perf_event_attr& FindEventAttrByType(const EventType& event_type); - const std::vector<std::unique_ptr<EventFd>>& FindEventFdsByType(const EventType& event_type); + const perf_event_attr& FindEventAttrByType(const EventTypeAndModifier& event_type_modifier); + const std::vector<std::unique_ptr<EventFd>>& FindEventFdsByType( + const EventTypeAndModifier& event_type_modifier); private: bool OpenEventFiles(const std::vector<pid_t>& threads, const std::vector<int>& cpus); struct EventSelection { - EventType event_type; + EventTypeAndModifier event_type_modifier; perf_event_attr event_attr; std::vector<std::unique_ptr<EventFd>> event_fds; }; - EventSelection* FindSelectionByType(const EventType& event_type); + EventSelection* FindSelectionByType(const EventTypeAndModifier& event_type_modifier); std::vector<EventSelection> selections_; diff --git a/simpleperf/event_type.cpp b/simpleperf/event_type.cpp index 526cfa53..508fb9b7 100644 --- a/simpleperf/event_type.cpp +++ b/simpleperf/event_type.cpp @@ -105,7 +105,8 @@ const EventType* FindEventTypeByName(const std::string& name) { std::unique_ptr<EventTypeAndModifier> ParseEventType(const std::string& event_type_str) { static std::string modifier_characters = "ukhGHp"; std::unique_ptr<EventTypeAndModifier> event_type_modifier(new EventTypeAndModifier); - std::string name = event_type_str; + event_type_modifier->name = event_type_str; + std::string event_type_name = event_type_str; std::string modifier; size_t comm_pos = event_type_str.rfind(':'); if (comm_pos != std::string::npos) { @@ -118,17 +119,17 @@ std::unique_ptr<EventTypeAndModifier> ParseEventType(const std::string& event_ty } } if (match_modifier) { - name = event_type_str.substr(0, comm_pos); + event_type_name = event_type_str.substr(0, comm_pos); modifier = event_type_str.substr(comm_pos + 1); } } - const EventType* event_type = FindEventTypeByName(name); + const EventType* event_type = FindEventTypeByName(event_type_name); if (event_type == nullptr) { // Try if the modifier belongs to the event type name, like some tracepoint events. if (!modifier.empty()) { - name = event_type_str; + event_type_name = event_type_str; modifier.clear(); - event_type = FindEventTypeByName(name); + event_type = FindEventTypeByName(event_type_name); } if (event_type == nullptr) { return nullptr; diff --git a/simpleperf/event_type.h b/simpleperf/event_type.h index df2f782d..7273e523 100644 --- a/simpleperf/event_type.h +++ b/simpleperf/event_type.h @@ -45,6 +45,7 @@ const EventType* FindEventTypeByConfig(uint32_t type, uint64_t config); const EventType* FindEventTypeByName(const std::string& name); struct EventTypeAndModifier { + std::string name; EventType event_type; bool exclude_user; bool exclude_kernel; |