OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 """A container for timeline-based events and traces and can handle importing | 4 """A container for timeline-based events and traces and can handle importing |
5 raw event data from different sources. This model closely resembles that in the | 5 raw event data from different sources. This model closely resembles that in the |
6 trace_viewer project: | 6 trace_viewer project: |
7 https://code.google.com/p/trace-viewer/ | 7 https://code.google.com/p/trace-viewer/ |
8 """ | 8 """ |
9 | 9 |
10 from operator import attrgetter | 10 from operator import attrgetter |
11 | 11 |
12 from telemetry.timeline import async_slice as async_slice_module | 12 from telemetry.timeline import async_slice as async_slice_module |
13 from telemetry.timeline import bounds | 13 from telemetry.timeline import bounds |
14 from telemetry.timeline import event_container | 14 from telemetry.timeline import event_container |
15 from telemetry.timeline import inspector_importer | 15 from telemetry.timeline import inspector_importer |
| 16 from telemetry.timeline import memory_dump_event |
16 from telemetry.timeline import process as process_module | 17 from telemetry.timeline import process as process_module |
17 from telemetry.timeline import slice as slice_module | 18 from telemetry.timeline import slice as slice_module |
18 from telemetry.timeline import surface_flinger_importer | 19 from telemetry.timeline import surface_flinger_importer |
19 from telemetry.timeline import tab_id_importer | 20 from telemetry.timeline import tab_id_importer |
20 from telemetry.timeline import trace_data as trace_data_module | 21 from telemetry.timeline import trace_data as trace_data_module |
21 from telemetry.timeline import trace_event_importer | 22 from telemetry.timeline import trace_event_importer |
22 | 23 |
23 # Register importers for data | 24 # Register importers for data |
24 | 25 |
25 _IMPORTERS = [ | 26 _IMPORTERS = [ |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 self._thread_time_bounds = {} | 63 self._thread_time_bounds = {} |
63 self._processes = {} | 64 self._processes = {} |
64 self._browser_process = None | 65 self._browser_process = None |
65 self._gpu_process = None | 66 self._gpu_process = None |
66 self._surface_flinger_process = None | 67 self._surface_flinger_process = None |
67 self._frozen = False | 68 self._frozen = False |
68 self._tab_ids_to_renderer_threads_map = {} | 69 self._tab_ids_to_renderer_threads_map = {} |
69 self.import_errors = [] | 70 self.import_errors = [] |
70 self.metadata = [] | 71 self.metadata = [] |
71 self.flow_events = [] | 72 self.flow_events = [] |
| 73 self._memory_dump_events = None |
72 if trace_data is not None: | 74 if trace_data is not None: |
73 self.ImportTraces(trace_data, shift_world_to_zero=shift_world_to_zero) | 75 self.ImportTraces(trace_data, shift_world_to_zero=shift_world_to_zero) |
74 | 76 |
| 77 def SetMemoryDumpEvents(self, memory_dump_events): |
| 78 """Populates the model with a sequence of MemoryDumpEvent objects.""" |
| 79 assert not self._frozen and self._memory_dump_events is None |
| 80 # keep events sorted in cronological order |
| 81 self._memory_dump_events = sorted(memory_dump_events, |
| 82 key=lambda event: event.start) |
| 83 |
| 84 def IterMemoryDumpEvents(self, reverse=False): |
| 85 """Iterate over the memory dump events of this model. |
| 86 |
| 87 Args: |
| 88 reverse: A boolean indicating whether to yield events in reversed time |
| 89 order. By default events are generated in chronological order. |
| 90 """ |
| 91 if self._memory_dump_events is None: |
| 92 return iter([]) # empty iterator |
| 93 elif reverse: |
| 94 return reversed(self._memory_dump_events) |
| 95 else: |
| 96 return iter(self._memory_dump_events) |
| 97 |
| 98 def IterEventsInThisContainer(self, event_type_predicate, event_predicate): |
| 99 if event_type_predicate(memory_dump_event.MemoryDumpEvent): |
| 100 for event in self.IterMemoryDumpEvents(): |
| 101 if event_predicate(event): |
| 102 yield event |
| 103 |
75 def IterChildContainers(self): | 104 def IterChildContainers(self): |
76 for process in self._processes.itervalues(): | 105 for process in self._processes.itervalues(): |
77 yield process | 106 yield process |
78 | 107 |
79 def GetAllProcesses(self): | 108 def GetAllProcesses(self): |
80 return self._processes.values() | 109 return self._processes.values() |
81 | 110 |
82 def GetAllThreads(self): | 111 def GetAllThreads(self): |
83 threads = [] | 112 threads = [] |
84 for process in self._processes.values(): | 113 for process in self._processes.values(): |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 importers = [] | 293 importers = [] |
265 for part in trace_data.active_parts: | 294 for part in trace_data.active_parts: |
266 importer_class = FindImporterClassForPart(part) | 295 importer_class = FindImporterClassForPart(part) |
267 if not importer_class: | 296 if not importer_class: |
268 raise Exception('No importer found for %s' % repr(part)) | 297 raise Exception('No importer found for %s' % repr(part)) |
269 importers.append(importer_class(self, trace_data)) | 298 importers.append(importer_class(self, trace_data)) |
270 | 299 |
271 importers.sort(key=lambda k: k.import_order) | 300 importers.sort(key=lambda k: k.import_order) |
272 | 301 |
273 return importers | 302 return importers |
OLD | NEW |