Index: base/test/trace_event_analyzer.cc |
diff --git a/base/test/trace_event_analyzer.cc b/base/test/trace_event_analyzer.cc |
index 183f29a93af04fdc4e2e05a224f598596352ba2c..17c18de8400ed6b250638d378a12fc6ac4f3691b 100644 |
--- a/base/test/trace_event_analyzer.cc |
+++ b/base/test/trace_event_analyzer.cc |
@@ -615,7 +615,7 @@ namespace { |
// Search |events| for |query| and add matches to |output|. |
size_t FindMatchingEvents(const std::vector<TraceEvent>& events, |
const Query& query, |
- TraceAnalyzer::TraceEventVector* output) { |
+ TraceEventVector* output) { |
for (size_t i = 0; i < events.size(); ++i) { |
if (query.Evaluate(events[i])) |
output->push_back(&events[i]); |
@@ -739,6 +739,19 @@ void TraceAnalyzer::AssociateEvents(const Query& first, |
} |
} |
+void TraceAnalyzer::MergeAssociatedEventArgs() { |
+ for (size_t i = 0; i < raw_events_.size(); ++i) { |
+ if (raw_events_[i].other_event) { |
+ raw_events_[i].arg_numbers.insert( |
+ raw_events_[i].other_event->arg_numbers.begin(), |
+ raw_events_[i].other_event->arg_numbers.end()); |
+ raw_events_[i].arg_strings.insert( |
+ raw_events_[i].other_event->arg_strings.begin(), |
+ raw_events_[i].other_event->arg_strings.end()); |
+ } |
+ } |
+} |
+ |
size_t TraceAnalyzer::FindEvents(const Query& query, TraceEventVector* output) { |
allow_assocation_changes_ = false; |
output->clear(); |
@@ -758,7 +771,23 @@ const std::string& TraceAnalyzer::GetThreadName( |
return thread_names_[thread]; |
} |
-bool TraceAnalyzer::GetRateStats(const TraceEventVector& events, Stats* stats) { |
+void TraceAnalyzer::ParseMetadata() { |
+ for (size_t i = 0; i < raw_events_.size(); ++i) { |
+ TraceEvent& this_event = raw_events_[i]; |
+ // Check for thread name metadata. |
+ if (this_event.phase != TRACE_EVENT_PHASE_METADATA || |
+ this_event.name != "thread_name") |
+ continue; |
+ std::map<std::string, std::string>::const_iterator string_it = |
+ this_event.arg_strings.find("name"); |
+ if (string_it != this_event.arg_strings.end()) |
+ thread_names_[this_event.thread] = string_it->second; |
+ } |
+} |
+ |
+// TraceEventVector utility functions. |
+ |
+bool GetRateStats(const TraceEventVector& events, RateStats* stats) { |
// Need at least 3 events to calculate rate stats. |
Zhenyao Mo
2011/12/12 22:30:13
CHECK(stats);
jbates
2011/12/12 22:54:42
Done.
|
if (events.size() < 3) { |
LOG(ERROR) << "Not enough events: " << events.size(); |
@@ -769,7 +798,7 @@ bool TraceAnalyzer::GetRateStats(const TraceEventVector& events, Stats* stats) { |
double delta_sum = 0.0; |
size_t num_deltas = events.size() - 1; |
for (size_t i = 0; i < num_deltas; ++i) { |
- double delta = events[i + 1]->timestamp - events[i]->timestamp; |
+ double delta = events.at(i + 1)->timestamp - events.at(i)->timestamp; |
if (delta < 0.0) { |
LOG(ERROR) << "Events are out of order"; |
return false; |
@@ -793,18 +822,87 @@ bool TraceAnalyzer::GetRateStats(const TraceEventVector& events, Stats* stats) { |
return true; |
} |
-void TraceAnalyzer::ParseMetadata() { |
- for (size_t i = 0; i < raw_events_.size(); ++i) { |
- TraceEvent& this_event = raw_events_[i]; |
- // Check for thread name metadata. |
- if (this_event.phase != TRACE_EVENT_PHASE_METADATA || |
- this_event.name != "thread_name") |
+bool FindFirstOf(const TraceEventVector& events, |
+ Query query, |
+ size_t position, |
+ size_t* return_index) { |
+ for (size_t i = position; i < events.size(); ++i) { |
+ if (query.Evaluate(*events.at(i))) { |
+ *return_index = i; |
Zhenyao Mo
2011/12/12 22:30:13
You should CHECK(return_index) before using it.
jbates
2011/12/12 22:54:42
Done.
|
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
+bool FindLastOf(const TraceEventVector& events, |
+ Query query, |
+ size_t position, |
+ size_t* return_index) { |
+ if (events.empty()) |
+ return false; |
+ position = (position < events.size()) ? position : events.size() - 1; |
+ for (;;) { |
+ if (query.Evaluate(*events.at(position))) { |
+ *return_index = position; |
Zhenyao Mo
2011/12/12 22:30:13
CHECK(return_index)
jbates
2011/12/12 22:54:42
Done.
|
+ return true; |
+ } |
+ if (position == 0) |
+ return false; |
+ --position; |
+ } |
+ return false; |
+} |
+ |
+bool FindClosest(const TraceEventVector& events, |
+ Query query, |
+ size_t position, |
+ size_t* return_closest, |
+ size_t* return_second_closest) { |
+ if (events.empty() || position >= events.size()) |
+ return false; |
+ size_t closest = events.size(); |
+ size_t second_closest = events.size(); |
+ for (size_t i = 0; i < events.size(); ++i) { |
+ if (!query.Evaluate(*events.at(i))) |
continue; |
- std::map<std::string, std::string>::const_iterator string_it = |
- this_event.arg_strings.find("name"); |
- if (string_it != this_event.arg_strings.end()) |
- thread_names_[this_event.thread] = string_it->second; |
+ if (closest == events.size()) { |
+ closest = i; |
+ continue; |
+ } |
+ if (fabs(events.at(i)->timestamp - events.at(position)->timestamp) < |
+ fabs(events.at(closest)->timestamp - events.at(position)->timestamp)) { |
+ second_closest = closest; |
+ closest = i; |
+ } else if (second_closest == events.size()) { |
+ second_closest = i; |
+ } |
+ } |
+ |
+ if (closest < events.size() && |
+ (!return_second_closest || second_closest < events.size())) { |
+ *return_closest = closest; |
Zhenyao Mo
2011/12/12 22:30:13
CHECK(return_closest);
jbates
2011/12/12 22:54:42
Done.
|
+ if (return_second_closest) |
+ *return_second_closest = second_closest; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+size_t CountMatches(const TraceEventVector& events, |
+ Query query, |
+ size_t begin_position, |
+ size_t end_position) { |
+ if (begin_position >= events.size()) |
+ return 0u; |
+ end_position = (end_position < events.size()) ? end_position : events.size(); |
+ size_t count = 0u; |
+ for (size_t i = begin_position; i < end_position; ++i) { |
+ if (query.Evaluate(*events.at(i))) |
+ ++count; |
} |
+ return count; |
} |
} // namespace trace_analyzer |