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

Commit dc97de58 authored by Jing Ji's avatar Jing Ji Committed by Android (Google) Code Review
Browse files

Merge "Add proper locks in the AppBatteryTracker"

parents b0c93719 7537f6e3
Loading
Loading
Loading
Loading
+91 −69
Original line number Original line 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.
     * 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();
    private final SparseDoubleArray mLastUidBatteryUsage = new SparseDoubleArray();


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


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

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


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


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


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


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


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


        final long lastUidBatteryUsageStartTs = mLastUidBatteryUsageStartTs;
        final long lastUidBatteryUsageStartTs;
        synchronized (mLock) {
            lastUidBatteryUsageStartTs = mLastUidBatteryUsageStartTs;
            mLastUidBatteryUsageStartTs = curStart;
            mLastUidBatteryUsageStartTs = curStart;
        }
        if (curStart > lastUidBatteryUsageStartTs && lastUidBatteryUsageStartTs > 0) {
        if (curStart > lastUidBatteryUsageStartTs && lastUidBatteryUsageStartTs > 0) {
            // The battery usage stats committed data since our last query,
            // The battery usage stats committed data since our last query,
            // let's query the snapshots to get the data since last start.
            // 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 (needUpdateUidBatteryUsageInWindow && curDuration > windowSize) {
            // If we do have long enough data for the window, save it.
            // If we do have long enough data for the window, save it.
            synchronized (mLock) {
                copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration);
                copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration);
            }
            needUpdateUidBatteryUsageInWindow = false;
            needUpdateUidBatteryUsageInWindow = false;
        }
        }


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


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


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