OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/latency/latency_info.h" | 5 #include "ui/latency/latency_info.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <string> | 10 #include <string> |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 static base::LazyInstance<LatencyInfoEnabledInitializer>::Leaky | 126 static base::LazyInstance<LatencyInfoEnabledInitializer>::Leaky |
127 g_latency_info_enabled = LAZY_INSTANCE_INITIALIZER; | 127 g_latency_info_enabled = LAZY_INSTANCE_INITIALIZER; |
128 | 128 |
129 } // namespace | 129 } // namespace |
130 | 130 |
131 namespace ui { | 131 namespace ui { |
132 | 132 |
133 LatencyInfo::LatencyInfo() : LatencyInfo(SourceEventType::UNKNOWN) {} | 133 LatencyInfo::LatencyInfo() : LatencyInfo(SourceEventType::UNKNOWN) {} |
134 | 134 |
135 LatencyInfo::LatencyInfo(SourceEventType type) | 135 LatencyInfo::LatencyInfo(SourceEventType type) |
136 : input_coordinates_size_(0), | 136 : trace_id_(-1), |
137 trace_id_(-1), | |
138 coalesced_(false), | 137 coalesced_(false), |
139 terminated_(false), | 138 terminated_(false), |
140 source_event_type_(type) {} | 139 source_event_type_(type) {} |
141 | 140 |
142 LatencyInfo::LatencyInfo(const LatencyInfo& other) = default; | 141 LatencyInfo::LatencyInfo(const LatencyInfo& other) = default; |
143 | 142 |
144 LatencyInfo::~LatencyInfo() {} | 143 LatencyInfo::~LatencyInfo() {} |
145 | 144 |
146 LatencyInfo::LatencyInfo(int64_t trace_id, bool terminated) | 145 LatencyInfo::LatencyInfo(int64_t trace_id, bool terminated) |
147 : input_coordinates_size_(0), | 146 : trace_id_(trace_id), |
148 trace_id_(trace_id), | |
149 terminated_(terminated), | 147 terminated_(terminated), |
150 source_event_type_(SourceEventType::UNKNOWN) {} | 148 source_event_type_(SourceEventType::UNKNOWN) {} |
151 | 149 |
152 bool LatencyInfo::Verify(const std::vector<LatencyInfo>& latency_info, | 150 bool LatencyInfo::Verify(const std::vector<LatencyInfo>& latency_info, |
153 const char* referring_msg) { | 151 const char* referring_msg) { |
154 if (latency_info.size() > kMaxLatencyInfoNumber) { | 152 if (latency_info.size() > kMaxLatencyInfoNumber) { |
155 LOG(ERROR) << referring_msg << ", LatencyInfo vector size " | 153 LOG(ERROR) << referring_msg << ", LatencyInfo vector size " |
156 << latency_info.size() << " is too big."; | 154 << latency_info.size() << " is too big."; |
157 TRACE_EVENT_INSTANT1("input,benchmark", "LatencyInfo::Verify Fails", | 155 TRACE_EVENT_INSTANT1("input,benchmark", "LatencyInfo::Verify Fails", |
158 TRACE_EVENT_SCOPE_GLOBAL, | 156 TRACE_EVENT_SCOPE_GLOBAL, |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 it->second.last_event_time = std::max(it->second.last_event_time, time); | 286 it->second.last_event_time = std::max(it->second.last_event_time, time); |
289 } | 287 } |
290 } | 288 } |
291 | 289 |
292 if (IsTerminalComponent(component) && trace_id_ != -1) { | 290 if (IsTerminalComponent(component) && trace_id_ != -1) { |
293 // Should only ever add terminal component once. | 291 // Should only ever add terminal component once. |
294 CHECK(!terminated_); | 292 CHECK(!terminated_); |
295 terminated_ = true; | 293 terminated_ = true; |
296 | 294 |
297 if (*latency_info_enabled) { | 295 if (*latency_info_enabled) { |
298 TRACE_EVENT_COPY_ASYNC_END2(kTraceCategoriesForAsyncEvents, | 296 TRACE_EVENT_COPY_ASYNC_END1( |
299 trace_name_.c_str(), | 297 kTraceCategoriesForAsyncEvents, trace_name_.c_str(), |
300 TRACE_ID_DONT_MANGLE(trace_id_), | 298 TRACE_ID_DONT_MANGLE(trace_id_), "data", AsTraceableData()); |
301 "data", AsTraceableData(), | |
302 "coordinates", CoordinatesAsTraceableData()); | |
303 } | 299 } |
304 | 300 |
305 TRACE_EVENT_WITH_FLOW0("input,benchmark", | 301 TRACE_EVENT_WITH_FLOW0("input,benchmark", |
306 "LatencyInfo.Flow", | 302 "LatencyInfo.Flow", |
307 TRACE_ID_DONT_MANGLE(trace_id_), | 303 TRACE_ID_DONT_MANGLE(trace_id_), |
308 TRACE_EVENT_FLAG_FLOW_IN); | 304 TRACE_EVENT_FLAG_FLOW_IN); |
309 } | 305 } |
310 } | 306 } |
311 | 307 |
312 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> | 308 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
(...skipping 10 matching lines...) Expand all Loading... |
323 component_info->SetDouble("count", lc.second.event_count); | 319 component_info->SetDouble("count", lc.second.event_count); |
324 component_info->SetDouble("sequence_number", | 320 component_info->SetDouble("sequence_number", |
325 lc.second.sequence_number); | 321 lc.second.sequence_number); |
326 record_data->Set(GetComponentName(lc.first.first), | 322 record_data->Set(GetComponentName(lc.first.first), |
327 std::move(component_info)); | 323 std::move(component_info)); |
328 } | 324 } |
329 record_data->SetDouble("trace_id", static_cast<double>(trace_id_)); | 325 record_data->SetDouble("trace_id", static_cast<double>(trace_id_)); |
330 return LatencyInfoTracedValue::FromValue(std::move(record_data)); | 326 return LatencyInfoTracedValue::FromValue(std::move(record_data)); |
331 } | 327 } |
332 | 328 |
333 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> | |
334 LatencyInfo::CoordinatesAsTraceableData() { | |
335 std::unique_ptr<base::ListValue> coordinates(new base::ListValue()); | |
336 for (size_t i = 0; i < input_coordinates_size_; i++) { | |
337 std::unique_ptr<base::DictionaryValue> coordinate_pair( | |
338 new base::DictionaryValue()); | |
339 coordinate_pair->SetDouble("x", input_coordinates_[i].x()); | |
340 coordinate_pair->SetDouble("y", input_coordinates_[i].y()); | |
341 coordinates->Append(std::move(coordinate_pair)); | |
342 } | |
343 return LatencyInfoTracedValue::FromValue(std::move(coordinates)); | |
344 } | |
345 | |
346 bool LatencyInfo::FindLatency(LatencyComponentType type, | 329 bool LatencyInfo::FindLatency(LatencyComponentType type, |
347 int64_t id, | 330 int64_t id, |
348 LatencyComponent* output) const { | 331 LatencyComponent* output) const { |
349 LatencyMap::const_iterator it = latency_components_.find( | 332 LatencyMap::const_iterator it = latency_components_.find( |
350 std::make_pair(type, id)); | 333 std::make_pair(type, id)); |
351 if (it == latency_components_.end()) | 334 if (it == latency_components_.end()) |
352 return false; | 335 return false; |
353 if (output) | 336 if (output) |
354 *output = it->second; | 337 *output = it->second; |
355 return true; | 338 return true; |
(...skipping 16 matching lines...) Expand all Loading... |
372 void LatencyInfo::RemoveLatency(LatencyComponentType type) { | 355 void LatencyInfo::RemoveLatency(LatencyComponentType type) { |
373 LatencyMap::iterator it = latency_components_.begin(); | 356 LatencyMap::iterator it = latency_components_.begin(); |
374 while (it != latency_components_.end()) { | 357 while (it != latency_components_.end()) { |
375 if (it->first.first == type) | 358 if (it->first.first == type) |
376 it = latency_components_.erase(it); | 359 it = latency_components_.erase(it); |
377 else | 360 else |
378 it++; | 361 it++; |
379 } | 362 } |
380 } | 363 } |
381 | 364 |
382 bool LatencyInfo::AddInputCoordinate(const gfx::PointF& input_coordinate) { | |
383 if (input_coordinates_size_ >= kMaxInputCoordinates) | |
384 return false; | |
385 input_coordinates_[input_coordinates_size_++] = input_coordinate; | |
386 return true; | |
387 } | |
388 | |
389 } // namespace ui | 365 } // namespace ui |
OLD | NEW |