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 """TraceEventImporter imports TraceEvent-formatted data | 4 """TraceEventImporter imports TraceEvent-formatted data |
5 into the provided model. | 5 into the provided model. |
6 This is a port of the trace event importer from | 6 This is a port of the trace event importer from |
7 https://code.google.com/p/trace-viewer/ | 7 https://code.google.com/p/trace-viewer/ |
8 """ | 8 """ |
9 | 9 |
10 import collections | 10 import collections |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
187 event['ts'] / 1000.0, | 187 event['ts'] / 1000.0, |
188 event.get('args')) | 188 event.get('args')) |
189 | 189 |
190 def _ProcessFlowEvent(self, event): | 190 def _ProcessFlowEvent(self, event): |
191 thread = (self._GetOrCreateProcess(event['pid']) | 191 thread = (self._GetOrCreateProcess(event['pid']) |
192 .GetOrCreateThread(event['tid'])) | 192 .GetOrCreateThread(event['tid'])) |
193 self._all_flow_events.append({ | 193 self._all_flow_events.append({ |
194 'event': event, | 194 'event': event, |
195 'thread': thread}) | 195 'thread': thread}) |
196 | 196 |
197 def _ProcessMemoryDumpEvent(self, event): | 197 def _ProcessMemoryDumpEvents(self, events): |
198 process = self._GetOrCreateProcess(event['pid']) | 198 # Dictionary to order dumps by id and process. |
199 memory_dump = memory_dump_event.ProcessMemoryDumpEvent(process, event) | 199 global_dumps = collections.defaultdict(dict) |
200 process.AddMemoryDumpEvent(memory_dump) | 200 for event in events: |
201 self._all_memory_dumps_by_dump_id[memory_dump.dump_id].append(memory_dump) | 201 process = self._GetOrCreateProcess(event['pid']) |
202 if process not in global_dumps[event['id']]: | |
203 global_dumps[event['id']][ | |
petrcermak
2016/01/07 18:59:29
this might look a bit better as follows:
global_d
| |
204 process] = memory_dump_event.ProcessMemoryDumpEvent( | |
205 process, event['id'], event['ts']) | |
206 global_dumps[event['id']][process].AddRawEvent(event) | |
207 for dump_id, global_dump in global_dumps.iteritems(): | |
208 for process, process_dump in global_dump.iteritems(): | |
209 process_dump.ProcessAllocatorDumps() | |
210 process.AddMemoryDumpEvent(process_dump) | |
211 self._all_memory_dumps_by_dump_id[dump_id].append(process_dump) | |
202 | 212 |
203 def ImportEvents(self): | 213 def ImportEvents(self): |
204 """Walks through the events_ list and outputs the structures discovered to | 214 """Walks through the events_ list and outputs the structures discovered to |
205 model_. | 215 model_. |
206 """ | 216 """ |
217 memory_dump_events = [] | |
207 for event in self._events: | 218 for event in self._events: |
208 phase = event.get('ph', None) | 219 phase = event.get('ph', None) |
209 if phase == 'B' or phase == 'E': | 220 if phase == 'B' or phase == 'E': |
210 self._ProcessDurationEvent(event) | 221 self._ProcessDurationEvent(event) |
211 elif phase == 'X': | 222 elif phase == 'X': |
212 self._ProcessCompleteEvent(event) | 223 self._ProcessCompleteEvent(event) |
213 # Note, S, F, T are deprecated and replaced by 'b' and 'e'. For | 224 # Note, S, F, T are deprecated and replaced by 'b' and 'e'. For |
214 # backwards compatibility continue to support them here. | 225 # backwards compatibility continue to support them here. |
215 elif phase == 'S' or phase == 'F' or phase == 'T': | 226 elif phase == 'S' or phase == 'F' or phase == 'T': |
216 self._ProcessAsyncEvent(event) | 227 self._ProcessAsyncEvent(event) |
217 elif phase == 'b' or phase == 'e': | 228 elif phase == 'b' or phase == 'e': |
218 self._ProcessAsyncEvent(event) | 229 self._ProcessAsyncEvent(event) |
219 # Note, I is historic. The instant event marker got changed, but we | 230 # Note, I is historic. The instant event marker got changed, but we |
220 # want to support loading old trace files so we have both I and i. | 231 # want to support loading old trace files so we have both I and i. |
221 elif phase == 'I' or phase == 'i': | 232 elif phase == 'I' or phase == 'i': |
222 self._ProcessInstantEvent(event) | 233 self._ProcessInstantEvent(event) |
223 elif phase == 'P': | 234 elif phase == 'P': |
224 self._ProcessSampleEvent(event) | 235 self._ProcessSampleEvent(event) |
225 elif phase == 'C': | 236 elif phase == 'C': |
226 self._ProcessCounterEvent(event) | 237 self._ProcessCounterEvent(event) |
227 elif phase == 'M': | 238 elif phase == 'M': |
228 self._ProcessMetadataEvent(event) | 239 self._ProcessMetadataEvent(event) |
229 elif phase == 'N' or phase == 'D' or phase == 'O': | 240 elif phase == 'N' or phase == 'D' or phase == 'O': |
230 self._ProcessObjectEvent(event) | 241 self._ProcessObjectEvent(event) |
231 elif phase == 's' or phase == 't' or phase == 'f': | 242 elif phase == 's' or phase == 't' or phase == 'f': |
232 self._ProcessFlowEvent(event) | 243 self._ProcessFlowEvent(event) |
233 elif phase == 'v': | 244 elif phase == 'v': |
234 self._ProcessMemoryDumpEvent(event) | 245 memory_dump_events.append(event) |
235 elif phase == 'R': | 246 elif phase == 'R': |
236 self._ProcessMarkEvent(event) | 247 self._ProcessMarkEvent(event) |
237 else: | 248 else: |
238 self._model.import_errors.append('Unrecognized event phase: ' + | 249 self._model.import_errors.append('Unrecognized event phase: ' + |
239 phase + '(' + event['name'] + ')') | 250 phase + '(' + event['name'] + ')') |
240 | 251 |
252 # Memory dumps of a process with the same dump id need to be merged before | |
253 # processing. So, memory dump events are processed all at once. | |
254 self._ProcessMemoryDumpEvents(memory_dump_events) | |
241 return self._model | 255 return self._model |
242 | 256 |
243 def FinalizeImport(self): | 257 def FinalizeImport(self): |
244 """Called by the Model after all other importers have imported their | 258 """Called by the Model after all other importers have imported their |
245 events.""" | 259 events.""" |
246 self._model.UpdateBounds() | 260 self._model.UpdateBounds() |
247 | 261 |
248 # We need to reupdate the bounds in case the minimum start time changes | 262 # We need to reupdate the bounds in case the minimum start time changes |
249 self._model.UpdateBounds() | 263 self._model.UpdateBounds() |
250 self._CreateAsyncSlices() | 264 self._CreateAsyncSlices() |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
426 | 440 |
427 def _SetBrowserProcess(self): | 441 def _SetBrowserProcess(self): |
428 for thread in self._model.GetAllThreads(): | 442 for thread in self._model.GetAllThreads(): |
429 if thread.name == 'CrBrowserMain': | 443 if thread.name == 'CrBrowserMain': |
430 self._model.browser_process = thread.parent | 444 self._model.browser_process = thread.parent |
431 | 445 |
432 def _SetGpuProcess(self): | 446 def _SetGpuProcess(self): |
433 for thread in self._model.GetAllThreads(): | 447 for thread in self._model.GetAllThreads(): |
434 if thread.name == 'CrGpuMain': | 448 if thread.name == 'CrGpuMain': |
435 self._model.gpu_process = thread.parent | 449 self._model.gpu_process = thread.parent |
OLD | NEW |