SamplingTimer: Fix issue with summary recording too much

The summary is supposed to just hold enough data to continue counting
once the device has reset. Since kernel stats reset when the device
resets, and the first update is ignored to account for soft resets where the
kernel continues running, SamplingTimer should not be recording the last value
it saw from /proc/wakelocks in the summary.

Bug:30575302
Change-Id: Ic193bc5af9a0ede514e3abc8146523d7316c47d3
This commit is contained in:
Adam Lesinski
2016-08-12 15:49:44 -07:00
parent 58635e74ed
commit 9edd6be542
2 changed files with 32 additions and 27 deletions

View File

@@ -108,7 +108,7 @@ public class BatteryStatsImpl extends BatteryStats {
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
private static final int VERSION = 149 + (USE_OLD_HISTORY ? 1000 : 0);
private static final int VERSION = 150 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -1415,22 +1415,6 @@ public class BatteryStatsImpl extends BatteryStats {
mUnpluggedReportedCount = 0;
return true;
}
@Override
public void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
super.writeSummaryFromParcelLocked(out, batteryRealtime);
out.writeLong(mCurrentReportedTotalTime);
out.writeInt(mCurrentReportedCount);
out.writeInt(mTrackingReportedValues ? 1 : 0);
}
@Override
public void readSummaryFromParcelLocked(Parcel in) {
super.readSummaryFromParcelLocked(in);
mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
mTrackingReportedValues = in.readInt() == 1;
}
}
/**

View File

@@ -178,19 +178,40 @@ public class BatteryStatsSamplingTimerTest extends TestCase {
clocks.elapsedRealtime() * 1000);
offBatterySummaryParcel.setDataPosition(0);
// Read the on battery summary from the parcel.
BatteryStatsImpl.SamplingTimer unparceledTimer = new BatteryStatsImpl.SamplingTimer(
clocks, timeBase);
unparceledTimer.readSummaryFromParcelLocked(onBatterySummaryParcel);
// Set the timebase running again. That way any issues with tracking reported values
// get tested when we unparcel the timers below.
timeBase.setRunning(true, clocks.uptimeMillis(), clocks.elapsedRealtime());
assertEquals(10, unparceledTimer.getTotalTimeLocked(0, BatteryStats.STATS_SINCE_CHARGED));
assertEquals(1, unparceledTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
// Read the on battery summary from the parcel.
BatteryStatsImpl.SamplingTimer unparceledOnBatteryTimer =
new BatteryStatsImpl.SamplingTimer(clocks, timeBase);
unparceledOnBatteryTimer.readSummaryFromParcelLocked(onBatterySummaryParcel);
assertEquals(10, unparceledOnBatteryTimer.getTotalTimeLocked(0,
BatteryStats.STATS_SINCE_CHARGED));
assertEquals(1, unparceledOnBatteryTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
// Read the off battery summary from the parcel.
unparceledTimer = new BatteryStatsImpl.SamplingTimer(clocks, timeBase);
unparceledTimer.readSummaryFromParcelLocked(offBatterySummaryParcel);
BatteryStatsImpl.SamplingTimer unparceledOffBatteryTimer =
new BatteryStatsImpl.SamplingTimer(clocks, timeBase);
unparceledOffBatteryTimer.readSummaryFromParcelLocked(offBatterySummaryParcel);
assertEquals(10, unparceledTimer.getTotalTimeLocked(0, BatteryStats.STATS_SINCE_CHARGED));
assertEquals(1, unparceledTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
assertEquals(10, unparceledOffBatteryTimer.getTotalTimeLocked(0,
BatteryStats.STATS_SINCE_CHARGED));
assertEquals(1, unparceledOffBatteryTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
// Now, just like with a fresh timer, the first update should be absorbed to account for
// data being collected when we weren't recording.
unparceledOnBatteryTimer.update(10, 10);
assertEquals(10, unparceledOnBatteryTimer.getTotalTimeLocked(0,
BatteryStats.STATS_SINCE_CHARGED));
assertEquals(1, unparceledOnBatteryTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
unparceledOffBatteryTimer.update(10, 10);
assertEquals(10, unparceledOffBatteryTimer.getTotalTimeLocked(0,
BatteryStats.STATS_SINCE_CHARGED));
assertEquals(1, unparceledOffBatteryTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
}
}