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

Commit 7537f6e3 authored by Jing Ji's avatar Jing Ji
Browse files

Add proper locks in the AppBatteryTracker

Bug: 200326767
Bug: 203105544
Test: atest FrameworksMockingServicesTests:BackgroundRestrictionTest
Change-Id: I189982111b2cfec7c12fee45b136e5a54360233a
parent 354efbc3
Loading
Loading
Loading
Loading
+91 −69
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
    /**
     * The uid battery usage stats data from our last query, it does not include snapshot data.
     */
    // No lock is needed.
    @GuardedBy("mLock")
    private final SparseDoubleArray mLastUidBatteryUsage = new SparseDoubleArray();

    // No lock is needed.
@@ -154,13 +154,16 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
    // No lock is needed.
    private final SparseDoubleArray mTmpUidBatteryUsage2 = new SparseDoubleArray();

    // No lock is needed.
    private final SparseDoubleArray mTmpUidBatteryUsageInWindow = new SparseDoubleArray();

    // No lock is needed.
    private final ArraySet<UserHandle> mTmpUserIds = new ArraySet<>();

    /**
     * The start timestamp of the battery usage stats result from our last query.
     */
    // No lock is needed.
    @GuardedBy("mLock")
    private long mLastUidBatteryUsageStartTs;

    // For debug only.
@@ -296,16 +299,21 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
            checkBatteryUsageStats();
        } else {
            // We didn't do the battery stats update above, schedule a check later.
            synchronized (mLock) {
                scheduleBatteryUsageStatsUpdateIfNecessary(
                        mLastBatteryUsageSamplingTs + mBatteryUsageStatsPollingMinIntervalMs - now);
            }
        }
    }

    private void checkBatteryUsageStats() {
        final long now = SystemClock.elapsedRealtime();
        final AppBatteryPolicy bgPolicy = mInjector.getPolicy();
        try {
            final SparseDoubleArray uidConsumers = mUidBatteryUsageInWindow;
            final SparseDoubleArray uidConsumers = mTmpUidBatteryUsageInWindow;
            synchronized (mLock) {
                copyUidBatteryUsage(mUidBatteryUsageInWindow, uidConsumers);
            }
            final long since = Math.max(0, now - bgPolicy.mBgCurrentDrainWindowMs);
            for (int i = 0, size = uidConsumers.size(); i < size; i++) {
                final int uid = uidConsumers.keyAt(i);
@@ -408,7 +416,9 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>

        if (curDuration >= windowSize) {
            // If we do have long enough data for the window, save it.
            synchronized (mLock) {
                copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration);
            }
            needUpdateUidBatteryUsageInWindow = false;
        }

@@ -416,8 +426,11 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
        mTmpUidBatteryUsage2.clear();
        copyUidBatteryUsage(buf, mTmpUidBatteryUsage2);

        final long lastUidBatteryUsageStartTs = mLastUidBatteryUsageStartTs;
        final long lastUidBatteryUsageStartTs;
        synchronized (mLock) {
            lastUidBatteryUsageStartTs = mLastUidBatteryUsageStartTs;
            mLastUidBatteryUsageStartTs = curStart;
        }
        if (curStart > lastUidBatteryUsageStartTs && lastUidBatteryUsageStartTs > 0) {
            // The battery usage stats committed data since our last query,
            // let's query the snapshots to get the data since last start.
@@ -429,11 +442,14 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
        }
        if (needUpdateUidBatteryUsageInWindow && curDuration > windowSize) {
            // If we do have long enough data for the window, save it.
            synchronized (mLock) {
                copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration);
            }
            needUpdateUidBatteryUsageInWindow = false;
        }

        // Add the delta into the global records.
        synchronized (mLock) {
            for (int i = 0, size = buf.size(); i < size; i++) {
                final int uid = buf.keyAt(i);
                final int index = mUidBatteryUsage.indexOfKey(uid);
@@ -450,7 +466,8 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
                if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
                    final double actualDelta = buf.valueAt(i) - mLastUidBatteryUsage.get(uid, 0.0d);
                    String msg = "Updating mUidBatteryUsage uid=" + uid + ", before=" + before
                        + ", after=" + mUidBatteryUsage.get(uid, 0.0d) + ", delta=" + actualDelta
                            + ", after=" + mUidBatteryUsage.get(uid, 0.0d)
                            + ", delta=" + actualDelta
                            + ", last=" + mLastUidBatteryUsage.get(uid, 0.0d)
                            + ", curStart=" + curStart
                            + ", lastLastStart=" + lastUidBatteryUsageStartTs
@@ -465,6 +482,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
            }
            // Now update the mLastUidBatteryUsage with the data we just saved above.
            copyUidBatteryUsage(mTmpUidBatteryUsage2, mLastUidBatteryUsage);
        }
        mTmpUidBatteryUsage2.clear();

        if (needUpdateUidBatteryUsageInWindow) {
@@ -473,9 +491,11 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
                    .includeProcessStateData()
                    .aggregateSnapshots(now - windowSize, lastUidBatteryUsageStartTs);
            updateBatteryUsageStatsOnceInternal(buf, builder, userIds, batteryStatsInternal);
            synchronized (mLock) {
                copyUidBatteryUsage(buf, mUidBatteryUsageInWindow);
            }
        }
    }

    private static BatteryUsageStats updateBatteryUsageStatsOnceInternal(
            SparseDoubleArray buf, BatteryUsageStatsQuery.Builder builder,
@@ -584,6 +604,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
        pw.print(prefix);
        pw.println("APP BATTERY STATE TRACKER:");
        updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true);
        synchronized (mLock) {
            final SparseDoubleArray uidConsumers = mUidBatteryUsageInWindow;
            pw.print("  " + prefix);
            pw.print("Boot=");
@@ -618,6 +639,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
                            mUidBatteryUsage.get(uid, 0.0d));
                }
            }
        }
        super.dump(pw, prefix);
    }