Index: tools/telemetry/telemetry/timeline/model.py |
diff --git a/tools/telemetry/telemetry/timeline/model.py b/tools/telemetry/telemetry/timeline/model.py |
index 84cd43650a6470a884fcdb3a478bde6467585850..6c6e340e9c300cdb6d2a877b401a6b93bc6199be 100644 |
--- a/tools/telemetry/telemetry/timeline/model.py |
+++ b/tools/telemetry/telemetry/timeline/model.py |
@@ -9,19 +9,18 @@ https://code.google.com/p/trace-viewer/ |
from operator import attrgetter |
-import telemetry.timeline.process as process_module |
-from telemetry.timeline import slice as slice_module |
from telemetry.timeline import async_slice as async_slice_module |
- |
-# Register importers for data |
from telemetry.timeline import bounds |
-from telemetry.timeline import empty_timeline_data_importer |
from telemetry.timeline import event_container |
from telemetry.timeline import inspector_importer |
+from telemetry.timeline import slice as slice_module |
+from telemetry.timeline import process as process_module |
+from telemetry.timeline import tab_id_importer |
from telemetry.timeline import trace_event_importer |
+from telemetry.value import trace as trace_value_module |
+ |
_IMPORTERS = [ |
- empty_timeline_data_importer.EmptyTimelineDataImporter, |
inspector_importer.InspectorTimelineImporter, |
trace_event_importer.TraceEventTimelineImporter |
] |
@@ -38,6 +37,7 @@ class MarkerOverlapError(Exception): |
super(MarkerOverlapError, self).__init__( |
'Overlapping timeline markers found') |
+ |
def IsSliceOrAsyncSlice(t): |
if t == async_slice_module.AsyncSlice: |
return True |
@@ -45,12 +45,11 @@ def IsSliceOrAsyncSlice(t): |
class TimelineModel(event_container.TimelineEventContainer): |
- def __init__(self, timeline_data=None, shift_world_to_zero=True): |
- """ Initializes a TimelineModel. timeline_data can be a single TimelineData |
- object, a list of TimelineData objects, or None. If timeline_data is not |
- None, all events from it will be imported into the model. The events will |
- be shifted such that the first event starts at time 0, if |
- shift_world_to_zero is True. |
+ def __init__(self, trace_value=None, shift_world_to_zero=True): |
+ """ Initializes a TimelineModel. |
+ |
+ The trace_value and shift_world_to_zero are passed to ImportTraces, |
+ if provided. |
""" |
super(TimelineModel, self).__init__(name='TimelineModel', parent=None) |
self._bounds = bounds.Bounds() |
@@ -62,8 +61,8 @@ class TimelineModel(event_container.TimelineEventContainer): |
self.import_errors = [] |
self.metadata = [] |
self.flow_events = [] |
- if timeline_data is not None: |
- self.ImportTraces(timeline_data, shift_world_to_zero=shift_world_to_zero) |
+ if trace_value is not None: |
+ self.ImportTraces(trace_value, shift_world_to_zero=shift_world_to_zero) |
def IterChildContainers(self): |
for process in self._processes.itervalues(): |
@@ -102,22 +101,25 @@ class TimelineModel(event_container.TimelineEventContainer): |
'trace is imported') |
self._tab_ids_to_renderer_threads_map[tab_id] = renderer_thread |
- def ImportTraces(self, timeline_data, shift_world_to_zero=True): |
+ def ImportTraces(self, trace_value, shift_world_to_zero=True): |
+ """ |
+ Populates the model with the provided trace data. |
+ |
+ trace_value must be a TraceValue. |
+ |
+ Passing shift_world_to_zero-True causes the events to |
+ be shifted such that the first event starts at time 0. |
+ """ |
if self._frozen: |
raise Exception("Cannot add events once trace is imported") |
+ assert isinstance(trace_value, trace_value_module.TraceValue) |
- importers = [] |
- if isinstance(timeline_data, list): |
- for item in timeline_data: |
- importers.append(self._CreateImporter(item)) |
- else: |
- importers.append(self._CreateImporter(timeline_data)) |
- |
- importers.sort(cmp=lambda x, y: x.import_priority - y.import_priority) |
+ importers = self._CreateImporters(trace_value) |
for importer in importers: |
- # TODO: catch exceptions here and add it to error list |
importer.ImportEvents() |
+ for record in trace_value.metadata_records: |
+ self.metadata.append(record) |
self.FinalizeImport(shift_world_to_zero, importers) |
def FinalizeImport(self, shift_world_to_zero=False, importers=None): |
@@ -225,8 +227,21 @@ class TimelineModel(event_container.TimelineEventContainer): |
def GetRendererThreadFromTabId(self, tab_id): |
return self._tab_ids_to_renderer_threads_map.get(tab_id, None) |
- def _CreateImporter(self, event_data): |
- for importer_class in _IMPORTERS: |
- if importer_class.CanImport(event_data): |
- return importer_class(self, event_data) |
- raise ValueError("Could not find an importer for the provided event data") |
+ def _CreateImporters(self, trace_value): |
+ def FindImporterClassForPart(part): |
+ for importer_class in _IMPORTERS: |
+ if importer_class.GetSupportedPart() == part: |
+ return importer_class |
+ return None |
+ |
+ |
+ importers = [] |
+ for part in trace_value.active_parts: |
+ importer_class = FindImporterClassForPart(part) |
+ if not importer_class: |
+ raise Exception('No importer found for %s' % repr(part)) |
+ importers.append(importer_class(self, trace_value)) |
+ |
+ importers.sort(lambda k: k.import_order) |
slamm
2014/08/12 23:11:59
Are you meaning to use cmp or key here?
importers
|
+ |
+ return importers |