| OLD | NEW |
| (Empty) |
| 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 | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 import telemetry.timeline.event as timeline_event | |
| 6 | |
| 7 | |
| 8 class Slice(timeline_event.TimelineEvent): | |
| 9 """A Slice represents an interval of time plus parameters associated | |
| 10 with that interval. | |
| 11 | |
| 12 NOTE: The Sample class implements the same interface as | |
| 13 Slice. These must be kept in sync. | |
| 14 | |
| 15 All time units are stored in milliseconds. | |
| 16 """ | |
| 17 def __init__(self, parent_thread, category, name, timestamp, duration=0, | |
| 18 thread_timestamp=None, thread_duration=None, args=None): | |
| 19 super(Slice, self).__init__( | |
| 20 category, name, timestamp, duration, thread_timestamp, thread_duration, | |
| 21 args) | |
| 22 self.parent_thread = parent_thread | |
| 23 self.parent_slice = None | |
| 24 self.sub_slices = [] | |
| 25 self.did_not_finish = False | |
| 26 | |
| 27 def AddSubSlice(self, sub_slice): | |
| 28 assert sub_slice.parent_slice == self | |
| 29 self.sub_slices.append(sub_slice) | |
| 30 | |
| 31 def IterEventsInThisContainerRecrusively(self, stack=None): | |
| 32 # This looks awkward, but it lets us create only a single iterator instead | |
| 33 # of having to create one iterator for every subslice found. | |
| 34 if stack == None: | |
| 35 stack = [] | |
| 36 else: | |
| 37 assert len(stack) == 0 | |
| 38 stack.extend(reversed(self.sub_slices)) | |
| 39 while len(stack): | |
| 40 s = stack.pop() | |
| 41 yield s | |
| 42 stack.extend(reversed(s.sub_slices)) | |
| 43 | |
| 44 @property | |
| 45 def self_time(self): | |
| 46 """Time spent in this function less any time spent in child events.""" | |
| 47 child_total = sum( | |
| 48 [e.duration for e in self.sub_slices]) | |
| 49 return self.duration - child_total | |
| 50 | |
| 51 @property | |
| 52 def self_thread_time(self): | |
| 53 """Thread (scheduled) time spent in this function less any thread time spent | |
| 54 in child events. Returns None if the slice or any of its children does not | |
| 55 have a thread_duration value. | |
| 56 """ | |
| 57 if not self.thread_duration: | |
| 58 return None | |
| 59 | |
| 60 child_total = 0 | |
| 61 for e in self.sub_slices: | |
| 62 if e.thread_duration == None: | |
| 63 return None | |
| 64 child_total += e.thread_duration | |
| 65 | |
| 66 return self.thread_duration - child_total | |
| 67 | |
| 68 def _GetSubSlicesRecursive(self): | |
| 69 for sub_slice in self.sub_slices: | |
| 70 for s in sub_slice.GetAllSubSlices(): | |
| 71 yield s | |
| 72 yield sub_slice | |
| 73 | |
| 74 def GetAllSubSlices(self): | |
| 75 return list(self._GetSubSlicesRecursive()) | |
| 76 | |
| 77 def GetAllSubSlicesOfName(self, name): | |
| 78 return [e for e in self.GetAllSubSlices() if e.name == name] | |
| OLD | NEW |