Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e970e914 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov Committed by Android (Google) Code Review
Browse files

Merge "Prevent recursive calls when inserting a "wakelock-update" battery history event"

parents 1171b319 be0fa757
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1831,7 +1831,7 @@ public class AppProfiler {
            final BatteryStatsImpl bstats = mService.mBatteryStatsService.getActiveStatistics();
            synchronized (bstats) {
                if (haveNewCpuStats) {
                    if (bstats.startAddingCpuLocked()) {
                    if (bstats.startAddingCpuStatsLocked()) {
                        int totalUTime = 0;
                        int totalSTime = 0;
                        final int statsCount = mProcessCpuTracker.countStats();
@@ -1877,9 +1877,10 @@ public class AppProfiler {
                        final int irqTime = mProcessCpuTracker.getLastIrqTime();
                        final int softIrqTime = mProcessCpuTracker.getLastSoftIrqTime();
                        final int idleTime = mProcessCpuTracker.getLastIdleTime();
                        bstats.finishAddingCpuLocked(totalUTime, totalSTime, userTime,
                        bstats.addCpuStatsLocked(totalUTime, totalSTime, userTime,
                                systemTime, iowaitTime, irqTime, softIrqTime, idleTime);
                    }
                    bstats.finishAddingCpuStatsLocked();
                }

                if (mLastWriteTime < (now - BATTERY_STATS_TIME)) {
+29 −11
Original line number Diff line number Diff line
@@ -3925,6 +3925,7 @@ public class BatteryStatsImpl extends BatteryStats {
        private final HistoryStepDetails mDetails = new HistoryStepDetails();
        private boolean mHasHistoryStepDetails;
        private boolean mUpdateRequested;
        /**
         * Total time (in milliseconds) spent executing in user code.
@@ -3954,6 +3955,8 @@ public class BatteryStatsImpl extends BatteryStats {
        @Override
        public HistoryStepDetails getHistoryStepDetails() {
            if (!mUpdateRequested) {
                mUpdateRequested = true;
                // Perform a CPU update right after we do this collection, so we have started
                // collecting good data for the next step.
                requestImmediateCpuUpdate();
@@ -3961,8 +3964,11 @@ public class BatteryStatsImpl extends BatteryStats {
                if (mPlatformIdleStateCallback != null) {
                    mDetails.statSubsystemPowerState =
                            mPlatformIdleStateCallback.getSubsystemLowPowerStats();
                if (DEBUG) Slog.i(TAG, "WRITE SubsystemPowerState:" +
                        mDetails.statSubsystemPowerState);
                    if (DEBUG) {
                        Slog.i(TAG,
                                "WRITE SubsystemPowerState:" + mDetails.statSubsystemPowerState);
                    }
                }
            }
            if (!mHasHistoryStepDetails) {
@@ -4072,7 +4078,11 @@ public class BatteryStatsImpl extends BatteryStats {
            mCurStepStatIrqTimeMs += statIrqTimeMs;
            mCurStepStatSoftIrqTimeMs += statSoftIrqTimeMs;
            mCurStepStatIdleTimeMs += statIdleTimeMs;
        }
        public void finishAddingCpuLocked() {
            mHasHistoryStepDetails = true;
            mUpdateRequested = false;
        }
        @Override
@@ -4953,13 +4963,13 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    @GuardedBy("this")
    public boolean startAddingCpuLocked() {
    public boolean startAddingCpuStatsLocked() {
        mExternalSync.cancelCpuSyncDueToWakelockChange();
        return mOnBatteryInternal;
    }
    @GuardedBy("this")
    public void finishAddingCpuLocked(int totalUTimeMs, int totalSTimeMs, int statUserTimeMs,
    public void addCpuStatsLocked(int totalUTimeMs, int totalSTimeMs, int statUserTimeMs,
            int statSystemTimeMs, int statIOWaitTimeMs, int statIrqTimeMs,
            int statSoftIrqTimeMs, int statIdleTimeMs) {
        mStepDetailsCalculator.addCpuStats(totalUTimeMs, totalSTimeMs, statUserTimeMs,
@@ -4967,6 +4977,14 @@ public class BatteryStatsImpl extends BatteryStats {
                statSoftIrqTimeMs, statIdleTimeMs);
    }
    /**
     * Called after {@link #addCpuStatsLocked} has been invoked for all active apps.
     */
    @GuardedBy("this")
    public void finishAddingCpuStatsLocked() {
        mStepDetailsCalculator.finishAddingCpuLocked();
    }
    public void noteProcessDiedLocked(int uid, int pid) {
        uid = mapUid(uid);
        Uid u = mUidStats.get(uid);
+34 −11
Original line number Diff line number Diff line
@@ -41,10 +41,10 @@ import java.util.concurrent.Future;
public class BatteryStatsHistoryIteratorTest {
    private static final int APP_UID = Process.FIRST_APPLICATION_UID + 42;

    private MockClock mMockClock = new MockClock();
    private final MockClock mMockClock = new MockClock();
    private MockBatteryStatsImpl mBatteryStats;
    private Random mRandom = new Random();
    private MockExternalStatsSync mExternalStatsSync = new MockExternalStatsSync();
    private final Random mRandom = new Random();
    private final MockExternalStatsSync mExternalStatsSync = new MockExternalStatsSync();

    @Before
    public void setup() {
@@ -184,29 +184,27 @@ public class BatteryStatsHistoryIteratorTest {
                100, /* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0,
                1_000_000, 1_000_000, 1_000_000);

        assertThat(mExternalStatsSync.mSyncScheduled).isTrue();
        mBatteryStats.finishAddingCpuLocked(100, 0, 0, 0, 0, 0, 0, 0);
        mExternalStatsSync.mSyncScheduled = false;
        mExternalStatsSync.updateCpuStats(100, 1_100_000, 1_100_000);

        // Device was suspended for 3_000 seconds, note the difference in elapsed time and uptime
        mBatteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING,
                100, /* plugType */ 0, 80, 72, 3700, 2_400_000, 4_000_000, 0,
                5_000_000, 2_000_000, 5_000_000);

        assertThat(mExternalStatsSync.mSyncScheduled).isTrue();
        mBatteryStats.finishAddingCpuLocked(200, 0, 0, 0, 0, 0, 0, 0);
        mExternalStatsSync.mSyncScheduled = false;
        mExternalStatsSync.updateCpuStats(200, 5_100_000, 2_100_000);

        // Battery level is unchanged, so we don't write battery level details in history
        mBatteryStats.noteAlarmStartLocked("wakeup", null, APP_UID, 6_000_000, 3_000_000);

        assertThat(mExternalStatsSync.mSyncScheduled).isFalse();
        assertThat(mExternalStatsSync.isSyncScheduled()).isFalse();

        // Battery level drops, so we write the accumulated battery level details
        mBatteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING,
                100, /* plugType */ 0, 79, 72, 3700, 2_000_000, 4_000_000, 0,
                7_000_000, 4_000_000, 6_000_000);

        mExternalStatsSync.updateCpuStats(300, 7_100_000, 4_100_000);

        final BatteryStatsHistoryIterator iterator = mBatteryStats.iterateBatteryStatsHistory();

        BatteryStats.HistoryItem item;
@@ -218,6 +216,10 @@ public class BatteryStatsHistoryIteratorTest {
        assertThat(item.batteryLevel).isEqualTo(90);
        assertThat(item.stepDetails).isNull();

        assertThat(item = iterator.next()).isNotNull();
        assertThat(item.batteryLevel).isEqualTo(90);
        assertThat(item.eventCode).isEqualTo(BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS);

        assertThat(item = iterator.next()).isNotNull();
        assertThat(item.batteryLevel).isEqualTo(90);
        assertThat(item.states & BatteryStats.HistoryItem.STATE_CPU_RUNNING_FLAG).isEqualTo(0);
@@ -228,6 +230,10 @@ public class BatteryStatsHistoryIteratorTest {
        assertThat(item.states & BatteryStats.HistoryItem.STATE_CPU_RUNNING_FLAG).isNotEqualTo(0);
        assertThat(item.stepDetails.userTime).isEqualTo(0);

        assertThat(item = iterator.next()).isNotNull();
        assertThat(item.batteryLevel).isEqualTo(80);
        assertThat(item.eventCode).isEqualTo(BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS);

        assertThat(item = iterator.next()).isNotNull();
        assertThat(item.batteryLevel).isEqualTo(80);
        assertThat(item.eventCode).isEqualTo(BatteryStats.HistoryItem.EVENT_ALARM_START);
@@ -238,6 +244,10 @@ public class BatteryStatsHistoryIteratorTest {
        assertThat(item.states & BatteryStats.HistoryItem.STATE_CPU_RUNNING_FLAG).isNotEqualTo(0);
        assertThat(item.stepDetails.userTime).isEqualTo(200);

        assertThat(item = iterator.next()).isNotNull();
        assertThat(item.batteryLevel).isEqualTo(79);
        assertThat(item.eventCode).isEqualTo(BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS);

        assertThat(item = iterator.next()).isNull();
    }

@@ -258,7 +268,7 @@ public class BatteryStatsHistoryIteratorTest {
        assertThat(item.time).isEqualTo(elapsedTimeMs);
    }

    private static class MockExternalStatsSync extends MockBatteryStatsImpl.DummyExternalStatsSync {
    private class MockExternalStatsSync extends MockBatteryStatsImpl.DummyExternalStatsSync {
        private boolean mSyncScheduled;

        @Override
@@ -266,5 +276,18 @@ public class BatteryStatsHistoryIteratorTest {
            mSyncScheduled = true;
            return null;
        }

        public boolean isSyncScheduled() {
            return mSyncScheduled;
        }

        public void updateCpuStats(int totalUTimeMs, long elapsedRealtime, long uptime) {
            assertThat(mExternalStatsSync.mSyncScheduled).isTrue();
            mBatteryStats.recordHistoryEventLocked(elapsedRealtime, uptime,
                    BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, "wakelock-update", 0);
            mBatteryStats.addCpuStatsLocked(totalUTimeMs, 0, 0, 0, 0, 0, 0, 0);
            mBatteryStats.finishAddingCpuStatsLocked();
            mExternalStatsSync.mSyncScheduled = false;
        }
    }
}