import time
from telemetry.core import exceptions
-from telemetry.core.platform import power_monitor
+from telemetry.core.platform.power_monitor import sysfs_power_monitor
from telemetry.core.platform.profiler import monsoon
}
json.dump(result, output)
-class MonsoonPowerMonitor(power_monitor.PowerMonitor):
- def __init__(self):
- super(MonsoonPowerMonitor, self).__init__()
+class MonsoonPowerMonitor(sysfs_power_monitor.SysfsPowerMonitor):
+ def __init__(self, _, platform_backend):
+ super(MonsoonPowerMonitor, self).__init__(platform_backend)
self._powermonitor_process = None
self._powermonitor_output_file = None
self._is_collecting = None
def StartMonitoringPower(self, browser):
assert not self._powermonitor_process, (
'Must call StopMonitoringPower().')
+ super(MonsoonPowerMonitor, self).StartMonitoringPower(browser)
self._powermonitor_output_file = tempfile.TemporaryFile()
self._is_collecting = multiprocessing.Event()
self._powermonitor_process = multiprocessing.Process(
args=(self._monsoon,
self._is_collecting,
self._powermonitor_output_file))
+ # Ensure child is not left behind: parent kills daemonic children on exit.
+ self._powermonitor_process.daemon = True
self._powermonitor_process.start()
if not self._is_collecting.wait(timeout=0.5):
self._powermonitor_process.terminate()
assert self._powermonitor_process, (
'StartMonitoringPower() not called.')
try:
+ cpu_stats = super(MonsoonPowerMonitor, self).StopMonitoringPower()
# Tell powermonitor to take an immediate sample and join.
self._is_collecting.clear()
self._powermonitor_process.join()
self._powermonitor_output_file.seek(0)
powermonitor_output = self._powermonitor_output_file.read()
assert powermonitor_output, 'PowerMonitor produced no output'
- return MonsoonPowerMonitor.ParseSamplingOutput(powermonitor_output)
+ power_stats = MonsoonPowerMonitor.ParseSamplingOutput(powermonitor_output)
+ return super(MonsoonPowerMonitor, self).CombineResults(cpu_stats,
+ power_stats)
finally:
self._powermonitor_output_file = None
self._powermonitor_process = None