Index: tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py |
diff --git a/tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py b/tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py |
index badbdb0268c9739da9ba8832da42b4d9c8245ee3..abb6fe9eebf3809ba827b562a2c613061243a2bb 100644 |
--- a/tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py |
+++ b/tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py |
@@ -228,12 +228,23 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor): |
StoreMetricAverage(m, sample_durations, out_dict) |
return out_dict |
+ def _KillPowerMetricsProcess(self): |
+ """Kill a running powermetrics process.""" |
+ try: |
+ self._powermetrics_process.terminate() |
+ except OSError: |
+ # terminate() can fail when Powermetrics does not have the SetUID set. |
+ self._backend.LaunchApplication( |
+ '/usr/bin/pkill', |
+ ['-SIGTERM', os.path.basename(self.binary_path)], |
+ elevate_privilege=True) |
+ |
def StopMonitoringPower(self): |
assert self._powermetrics_process, ( |
'StartMonitoringPower() not called.') |
# Tell powermetrics to take an immediate sample. |
try: |
- self._powermetrics_process.terminate() |
+ self._KillPowerMetricsProcess() |
(power_stdout, power_stderr) = self._powermetrics_process.communicate() |
returncode = self._powermetrics_process.returncode |
assert returncode in [0, -15], ( |