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

Commit 62a9ff67 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Move RPM stats collection out of BatteryStatsImpl.mLock

Querying RPM stats on device with a large number of StateResidency info
can take a long time. Move the query to outside of the BatteryStats
lock to reduce the chance of lock contention.

Bug: 185970842
Test: atest android.cts.statsd.validation.ValidationTests#testPartialWakelock

Change-Id: I1c69b3f9c071e5d758cf4b22855c4b0ec221a5cf
parent bae80e0d
Loading
Loading
Loading
Loading
+21 −6
Original line number Original line Diff line number Diff line
@@ -275,7 +275,7 @@ public class BatteryStatsImpl extends BatteryStats {
    private int mNumAllUidCpuTimeReads;
    private int mNumAllUidCpuTimeReads;
    /** Container for Resource Power Manager stats. Updated by updateRpmStatsLocked. */
    /** Container for Resource Power Manager stats. Updated by updateRpmStatsLocked. */
    private final RpmStats mTmpRpmStats = new RpmStats();
    private RpmStats mTmpRpmStats = null;
    /** The soonest the RPM stats can be updated after it was last updated. */
    /** The soonest the RPM stats can be updated after it was last updated. */
    private static final long RPM_STATS_UPDATE_FREQ_MS = 1000;
    private static final long RPM_STATS_UPDATE_FREQ_MS = 1000;
    /** Last time that RPM stats were updated by updateRpmStatsLocked. */
    /** Last time that RPM stats were updated by updateRpmStatsLocked. */
@@ -12387,19 +12387,34 @@ public class BatteryStatsImpl extends BatteryStats {
        mLastBluetoothActivityInfo.set(info);
        mLastBluetoothActivityInfo.set(info);
    }
    }
    /**
    /**
     * Read and record Resource Power Manager (RPM) state and voter times.
     * Read Resource Power Manager (RPM) state and voter times.
     * If RPM stats were fetched more recently than RPM_STATS_UPDATE_FREQ_MS ago, uses the old data
     * If RPM stats were fetched more recently than RPM_STATS_UPDATE_FREQ_MS ago, uses the old data
     * instead of fetching it anew.
     * instead of fetching it anew.
     *
     * Note: This should be called without synchronizing this BatteryStatsImpl object
     */
     */
    public void updateRpmStatsLocked(long elapsedRealtimeUs) {
    public void fillLowPowerStats() {
        if (mPlatformIdleStateCallback == null) return;
        if (mPlatformIdleStateCallback == null) return;
        RpmStats rpmStats = new RpmStats();
        long now = SystemClock.elapsedRealtime();
        long now = SystemClock.elapsedRealtime();
        if (now - mLastRpmStatsUpdateTimeMs >= RPM_STATS_UPDATE_FREQ_MS) {
        if (now - mLastRpmStatsUpdateTimeMs >= RPM_STATS_UPDATE_FREQ_MS) {
            mPlatformIdleStateCallback.fillLowPowerStats(mTmpRpmStats);
            mPlatformIdleStateCallback.fillLowPowerStats(rpmStats);
            synchronized (this) {
                mTmpRpmStats = rpmStats;
                mLastRpmStatsUpdateTimeMs = now;
                mLastRpmStatsUpdateTimeMs = now;
            }
            }
        }
    }
    /**
     * Record Resource Power Manager (RPM) state and voter times.
     * TODO(b/185252376): Remove this logging. PowerStatsService logs the same data more
     * efficiently.
     */
    public void updateRpmStatsLocked(long elapsedRealtimeUs) {
        if (mTmpRpmStats == null) return;
        for (Map.Entry<String, RpmStats.PowerStatePlatformSleepState> pstate
        for (Map.Entry<String, RpmStats.PowerStatePlatformSleepState> pstate
                : mTmpRpmStats.mPlatformLowPowerStats.entrySet()) {
                : mTmpRpmStats.mPlatformLowPowerStats.entrySet()) {
+3 −0
Original line number Original line Diff line number Diff line
@@ -579,6 +579,9 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
            }
            }
        }
        }


        // Collect the latest low power stats without holding the mStats lock.
        mStats.fillLowPowerStats();

        final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
        final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
        final BluetoothActivityEnergyInfo bluetoothInfo = awaitControllerInfo(bluetoothReceiver);
        final BluetoothActivityEnergyInfo bluetoothInfo = awaitControllerInfo(bluetoothReceiver);
        ModemActivityInfo modemInfo = null;
        ModemActivityInfo modemInfo = null;