| Index: tools/telemetry/telemetry/timeline/tab_id_importer.py
|
| diff --git a/tools/telemetry/telemetry/timeline/tab_id_importer.py b/tools/telemetry/telemetry/timeline/tab_id_importer.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f5929d5bc6a67d40b6a53cdfaa08d6acae9c8430
|
| --- /dev/null
|
| +++ b/tools/telemetry/telemetry/timeline/tab_id_importer.py
|
| @@ -0,0 +1,54 @@
|
| +# Copyright 2014 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +from telemetry.timeline import importer
|
| +from telemetry.timeline import trace_data as trace_data_module
|
| +
|
| +class TraceBufferOverflowException(Exception):
|
| + pass
|
| +
|
| +
|
| +class TabIdImporter(importer.TimelineImporter):
|
| + def __init__(self, model, trace_data):
|
| + # Needs to run after all other importers so overflow events have been
|
| + # created on the model.
|
| + super(TabIdImporter, self).__init__(
|
| + model,
|
| + trace_data,
|
| + import_order=999)
|
| + self._trace_data = trace_data
|
| +
|
| + @staticmethod
|
| + def GetSupportedPart():
|
| + return trace_data_module.TAB_ID_PART
|
| +
|
| + def ImportEvents(self):
|
| + pass
|
| +
|
| + def FinalizeImport(self):
|
| + self._CheckTraceBufferOverflow()
|
| + self._CreateTabIdsToThreadsMap()
|
| +
|
| + def _CheckTraceBufferOverflow(self):
|
| + # Since _CreateTabIdsToThreadsMap() relies on markers output on timeline
|
| + # tracing data, it may not work in case we have trace events dropped due to
|
| + # trace buffer overflow.
|
| + for process in self._model.GetAllProcesses():
|
| + if process.trace_buffer_did_overflow:
|
| + raise TraceBufferOverflowException(
|
| + 'Trace buffer of process with pid=%d overflowed at timestamp %d. '
|
| + 'Raw trace data:\n%s' %
|
| + (process.pid, process.trace_buffer_overflow_event.start,
|
| + repr(self._trace_data)))
|
| +
|
| + def _CreateTabIdsToThreadsMap(self):
|
| + tab_id_events = self._trace_data.GetEventsFor(
|
| + trace_data_module.TAB_ID_PART)
|
| +
|
| + for tab_id in tab_id_events:
|
| + timeline_markers = self._model.FindTimelineMarkers(tab_id)
|
| + assert(len(timeline_markers) == 1)
|
| + assert(timeline_markers[0].start_thread == timeline_markers[0].end_thread)
|
| + self._model.AddMappingFromTabIdToRendererThread(
|
| + tab_id, timeline_markers[0].start_thread)
|
|
|