aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/telemetry/util/process_statistic_timeline_data.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/telemetry/telemetry/util/process_statistic_timeline_data.py')
-rw-r--r--catapult/telemetry/telemetry/util/process_statistic_timeline_data.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/util/process_statistic_timeline_data.py b/catapult/telemetry/telemetry/util/process_statistic_timeline_data.py
new file mode 100644
index 00000000..589e8d35
--- /dev/null
+++ b/catapult/telemetry/telemetry/util/process_statistic_timeline_data.py
@@ -0,0 +1,58 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+class ProcessStatisticTimelineData(object):
+ """Holds value of a stat for one or more processes.
+
+ This object can hold a value for more than one pid by adding another
+ object."""
+
+ def __init__(self, pid, value):
+ super(ProcessStatisticTimelineData, self).__init__()
+ assert value >= 0
+ self._value_by_pid = {pid: value}
+
+ def __sub__(self, other):
+ """The results of subtraction is an object holding only the pids contained
+ in |self|.
+
+ The motivation is that some processes may have died between two consecutive
+ measurements. The desired behavior is to only make calculations based on
+ the processes that are alive at the end of the second measurement."""
+ # pylint: disable=protected-access
+ ret = self.__class__(0, 0)
+ my_dict = self._value_by_pid
+
+ ret._value_by_pid = (
+ {k: my_dict[k] - other._value_by_pid.get(k, 0) for
+ k in my_dict.keys()})
+ return ret
+
+ def __add__(self, other):
+ """The result contains pids from both |self| and |other|, if duplicate
+ pids are found between objects, an error will occur. """
+ # pylint: disable=protected-access
+ intersecting_pids = (set(self._value_by_pid.keys()) &
+ set(other._value_by_pid.keys()))
+ assert len(intersecting_pids) == 0
+
+ ret = self.__class__(0, 0)
+ ret._value_by_pid = {}
+ ret._value_by_pid.update(self._value_by_pid)
+ ret._value_by_pid.update(other._value_by_pid)
+ return ret
+
+ @property
+ def value_by_pid(self):
+ return self._value_by_pid
+
+ def total_sum(self):
+ """Returns the sum of all values contained by this object. """
+ return sum(self._value_by_pid.values())
+
+
+class IdleWakeupTimelineData(ProcessStatisticTimelineData):
+ """A ProcessStatisticTimelineData to hold idle wakeups."""
+ pass