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.
5 import telemetry.timeline.counter as tracing_counter
6 import telemetry.timeline.event as event_module
7 import telemetry.timeline.event_container as event_container
8 import telemetry.timeline.thread as tracing_thread
11 class Process(event_container.TimelineEventContainer):
12 ''' The Process represents a single userland process in the trace.
14 def __init__(self, parent, pid):
15 super(Process, self).__init__('process %s' % pid, parent)
19 self._trace_buffer_overflow_event = None
22 def trace_buffer_did_overflow(self):
23 return self._trace_buffer_overflow_event is not None
26 def trace_buffer_overflow_event(self):
27 return self._trace_buffer_overflow_event
37 def IterChildContainers(self):
38 for thread in self._threads.itervalues():
40 for counter in self._counters.itervalues():
43 def IterEventsInThisContainer(self, event_type_predicate, event_predicate):
44 if (not self.trace_buffer_did_overflow or
45 not event_type_predicate(event_module.TimelineEvent) or
46 not event_predicate(self._trace_buffer_overflow_event)):
48 yield # pylint: disable=W0101
49 yield self._trace_buffer_overflow_event
51 def GetOrCreateThread(self, tid):
52 thread = self.threads.get(tid, None)
55 thread = tracing_thread.Thread(self, tid)
56 self._threads[tid] = thread
59 def GetCounter(self, category, name):
60 counter_id = category + '.' + name
61 if counter_id in self.counters:
62 return self.counters[counter_id]
64 'Counter %s not found in process with id %s.' % (counter_id,
66 def GetOrCreateCounter(self, category, name):
68 return self.GetCounter(category, name)
70 ctr = tracing_counter.Counter(self, category, name)
71 self._counters[ctr.full_name] = ctr
74 def AutoCloseOpenSlices(self, max_timestamp, thread_time_bounds):
75 for thread in self._threads.itervalues():
76 thread.AutoCloseOpenSlices(max_timestamp, thread_time_bounds[thread].max)
78 def SetTraceBufferOverflowTimestamp(self, timestamp):
79 # TODO: use instant event for trace_buffer_overflow_event
80 self._trace_buffer_overflow_event = event_module.TimelineEvent(
81 "TraceBufferInfo", "trace_buffer_overflowed", timestamp, 0)
83 def FinalizeImport(self):
84 for thread in self._threads.itervalues():
85 thread.FinalizeImport()
86 for counter in self._counters.itervalues():
87 counter.FinalizeImport()