From 154d124ace83350da51e2d6f795f88f7bda6b041 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Thu, 16 Feb 2017 10:01:48 -0800 Subject: [PATCH] Fix background sensor usage counter being out of sync with total count, due to nesting. Only update the counter if nesting is 1. Test: runtest -x frameworks/base/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java Change-Id: Iabb153550a79afa9902569bbbbdb5815decdc613 Fixes: 34750473 --- .../android/internal/os/BatteryStatsImpl.java | 23 +++++++++---------- .../internal/os/BatteryStatsSensorTest.java | 2 ++ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 9dca5ea6eaa6f..12d96e2d486f7 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -7914,12 +7914,11 @@ public class BatteryStatsImpl extends BatteryStats { } public void noteStartSensor(int sensor, long elapsedRealtimeMs) { - StopwatchTimer t = getSensorTimerLocked(sensor, true); - if (t != null) { - t.startRunningLocked(elapsedRealtimeMs); - } - Counter c = getSensorBgCounterLocked(sensor, true); - if (c != null && mProcessState >= PROCESS_STATE_BACKGROUND) { + StopwatchTimer t = getSensorTimerLocked(sensor, /* create= */ true); + t.startRunningLocked(elapsedRealtimeMs); + + Counter c = getSensorBgCounterLocked(sensor, /* create= */ true); + if (mProcessState >= PROCESS_STATE_BACKGROUND && t.mNesting == 1) { c.stepAtomic(); } } @@ -7933,17 +7932,17 @@ public class BatteryStatsImpl extends BatteryStats { } public void noteStartGps(long elapsedRealtimeMs) { - StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true); - if (t != null) { - t.startRunningLocked(elapsedRealtimeMs); - } - Counter c = getSensorBgCounterLocked(Sensor.GPS, true); - if (c != null && mProcessState >= PROCESS_STATE_BACKGROUND) { + StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, /* create= */ true); + t.startRunningLocked(elapsedRealtimeMs); + + Counter c = getSensorBgCounterLocked(Sensor.GPS, /* create= */ true); + if (mProcessState >= PROCESS_STATE_BACKGROUND && t.mNesting == 1) { c.stepAtomic(); } } public void noteStopGps(long elapsedRealtimeMs) { + // Don't create a timer if one doesn't already exist StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false); if (t != null) { t.stopRunningLocked(elapsedRealtimeMs); diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java index 0bdf7caa8903f..e15216384ec14 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java @@ -48,9 +48,11 @@ public class BatteryStatsSensorTest extends TestCase { bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_RECEIVER); bi.noteStartSensorLocked(UID, SENSOR_ID); + bi.noteStartSensorLocked(UID, SENSOR_ID); clocks.realtime = 400; clocks.uptime = 400; bi.noteStopSensorLocked(UID, SENSOR_ID); + bi.noteStopSensorLocked(UID, SENSOR_ID); BatteryStats.Timer sensorTimer = bi.getUidStats().get(UID).getSensorStats() .get(SENSOR_ID).getSensorTime();