Index: tools/telemetry/telemetry/timeline/trace_event_importer.py |
diff --git a/tools/telemetry/telemetry/timeline/trace_event_importer.py b/tools/telemetry/telemetry/timeline/trace_event_importer.py |
index 111e241fd1539a6027ed4daa835f69fd244c609f..6635dc6b8d9f43149769ac173638a0a16856d6c3 100644 |
--- a/tools/telemetry/telemetry/timeline/trace_event_importer.py |
+++ b/tools/telemetry/telemetry/timeline/trace_event_importer.py |
@@ -194,16 +194,25 @@ class TraceEventTimelineImporter(importer.TimelineImporter): |
'event': event, |
'thread': thread}) |
- def _ProcessMemoryDumpEvent(self, event): |
- process = self._GetOrCreateProcess(event['pid']) |
- memory_dump = memory_dump_event.ProcessMemoryDumpEvent(process, event) |
- process.AddMemoryDumpEvent(memory_dump) |
- self._all_memory_dumps_by_dump_id[memory_dump.dump_id].append(memory_dump) |
+ def _ProcessMemoryDumpEvents(self, events): |
+ # Dictionary to order dumps by id and process. |
+ global_dumps = collections.defaultdict(dict) |
+ for event in events: |
+ process = self._GetOrCreateProcess(event['pid']) |
+ dump_events = global_dumps[event['id']].setdefault(process, []) |
perezju
2016/01/12 15:53:38
nit: maybe you could also do global_dumps.setdefau
ssid
2016/01/12 17:13:18
Done.
|
+ dump_events.append(event) |
+ for dump_id, global_dump in global_dumps.iteritems(): |
+ for process, dump_events in global_dump.iteritems(): |
+ memory_dump = memory_dump_event.ProcessMemoryDumpEvent(process, |
+ dump_events) |
+ process.AddMemoryDumpEvent(memory_dump) |
+ self._all_memory_dumps_by_dump_id[dump_id].append(memory_dump) |
def ImportEvents(self): |
"""Walks through the events_ list and outputs the structures discovered to |
model_. |
""" |
+ memory_dump_events = [] |
for event in self._events: |
phase = event.get('ph', None) |
if phase == 'B' or phase == 'E': |
@@ -231,13 +240,16 @@ class TraceEventTimelineImporter(importer.TimelineImporter): |
elif phase == 's' or phase == 't' or phase == 'f': |
self._ProcessFlowEvent(event) |
elif phase == 'v': |
- self._ProcessMemoryDumpEvent(event) |
+ memory_dump_events.append(event) |
elif phase == 'R': |
self._ProcessMarkEvent(event) |
else: |
self._model.import_errors.append('Unrecognized event phase: ' + |
phase + '(' + event['name'] + ')') |
+ # Memory dumps of a process with the same dump id need to be merged before |
+ # processing. So, memory dump events are processed all at once. |
+ self._ProcessMemoryDumpEvents(memory_dump_events) |
return self._model |
def FinalizeImport(self): |