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

Commit 9bed261a authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Android (Google) Code Review
Browse files

Merge "Update BatteryStats cpustats collection to be asynchronous."

parents fbe9d430 c57729ad
Loading
Loading
Loading
Loading
+76 −56
Original line number Original line Diff line number Diff line
@@ -187,7 +187,7 @@ public class BatteryStatsImpl extends BatteryStats {
    public final AtomicFile mCheckinFile;
    public final AtomicFile mCheckinFile;
    public final AtomicFile mDailyFile;
    public final AtomicFile mDailyFile;
    static final int MSG_UPDATE_WAKELOCKS = 1;
    static final int MSG_REPORT_CPU_UPDATE_NEEDED = 1;
    static final int MSG_REPORT_POWER_CHANGE = 2;
    static final int MSG_REPORT_POWER_CHANGE = 2;
    static final int MSG_REPORT_CHARGING = 3;
    static final int MSG_REPORT_CHARGING = 3;
    static final long DELAY_UPDATE_WAKELOCKS = 5*1000;
    static final long DELAY_UPDATE_WAKELOCKS = 5*1000;
@@ -273,10 +273,7 @@ public class BatteryStatsImpl extends BatteryStats {
        public void handleMessage(Message msg) {
        public void handleMessage(Message msg) {
            BatteryCallback cb = mCallback;
            BatteryCallback cb = mCallback;
            switch (msg.what) {
            switch (msg.what) {
                case MSG_UPDATE_WAKELOCKS:
                case MSG_REPORT_CPU_UPDATE_NEEDED:
                    synchronized (BatteryStatsImpl.this) {
                        updateCpuTimeLocked();
                    }
                    if (cb != null) {
                    if (cb != null) {
                        cb.batteryNeedsCpuUpdate();
                        cb.batteryNeedsCpuUpdate();
                    }
                    }
@@ -302,6 +299,10 @@ public class BatteryStatsImpl extends BatteryStats {
        }
        }
    }
    }
    public void postBatteryNeedsCpuUpdateMsg() {
        mHandler.sendEmptyMessage(MSG_REPORT_CPU_UPDATE_NEEDED);
    }
    /**
    /**
     * Update per-freq cpu times for all the uids in {@link #mPendingUids}.
     * Update per-freq cpu times for all the uids in {@link #mPendingUids}.
     */
     */
@@ -487,6 +488,10 @@ public class BatteryStatsImpl extends BatteryStats {
        Future<?> scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff);
        Future<?> scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff);
        Future<?> scheduleCopyFromAllUidsCpuTimes(boolean onBattery, boolean onBatteryScreenOff);
        Future<?> scheduleCopyFromAllUidsCpuTimes(boolean onBattery, boolean onBatteryScreenOff);
        Future<?> scheduleCpuSyncDueToSettingChange();
        Future<?> scheduleCpuSyncDueToSettingChange();
        Future<?> scheduleCpuSyncDueToScreenStateChange(boolean onBattery,
                boolean onBatteryScreenOff);
        Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis);
        void cancelCpuSyncDueToWakelockChange();
    }
    }
    public Handler mHandler;
    public Handler mHandler;
@@ -1453,12 +1458,10 @@ public class BatteryStatsImpl extends BatteryStats {
        long mCount;
        long mCount;
        long mLoadedCount;
        long mLoadedCount;
        long mUnpluggedCount;
        long mUnpluggedCount;
        long mPluggedCount;
        LongSamplingCounter(TimeBase timeBase, Parcel in) {
        LongSamplingCounter(TimeBase timeBase, Parcel in) {
            mTimeBase = timeBase;
            mTimeBase = timeBase;
            mPluggedCount = in.readLong();
            mCount = in.readLong();
            mCount = mPluggedCount;
            mLoadedCount = in.readLong();
            mLoadedCount = in.readLong();
            mUnpluggedCount = in.readLong();
            mUnpluggedCount = in.readLong();
            timeBase.add(this);
            timeBase.add(this);
@@ -1477,16 +1480,15 @@ public class BatteryStatsImpl extends BatteryStats {
        @Override
        @Override
        public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
        public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
            mUnpluggedCount = mPluggedCount;
            mUnpluggedCount = mCount;
        }
        }
        @Override
        @Override
        public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
        public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
            mPluggedCount = mCount;
        }
        }
        public long getCountLocked(int which) {
        public long getCountLocked(int which) {
            long val = mTimeBase.isRunning() ? mCount : mPluggedCount;
            long val = mCount;
            if (which == STATS_SINCE_UNPLUGGED) {
            if (which == STATS_SINCE_UNPLUGGED) {
                val -= mUnpluggedCount;
                val -= mUnpluggedCount;
            } else if (which != STATS_SINCE_CHARGED) {
            } else if (which != STATS_SINCE_CHARGED) {
@@ -1499,12 +1501,15 @@ public class BatteryStatsImpl extends BatteryStats {
        public void logState(Printer pw, String prefix) {
        public void logState(Printer pw, String prefix) {
            pw.println(prefix + "mCount=" + mCount
            pw.println(prefix + "mCount=" + mCount
                    + " mLoadedCount=" + mLoadedCount
                    + " mLoadedCount=" + mLoadedCount
                    + " mUnpluggedCount=" + mUnpluggedCount
                    + " mUnpluggedCount=" + mUnpluggedCount);
                    + " mPluggedCount=" + mPluggedCount);
        }
        }
        void addCountLocked(long count) {
        void addCountLocked(long count) {
            if (mTimeBase.isRunning()) {
            addCountLocked(count, mTimeBase.isRunning());
        }
        void addCountLocked(long count, boolean isRunning) {
            if (isRunning) {
                mCount += count;
                mCount += count;
            }
            }
        }
        }
@@ -1514,7 +1519,7 @@ public class BatteryStatsImpl extends BatteryStats {
         */
         */
        void reset(boolean detachIfReset) {
        void reset(boolean detachIfReset) {
            mCount = 0;
            mCount = 0;
            mLoadedCount = mPluggedCount = mUnpluggedCount = 0;
            mLoadedCount = mUnpluggedCount = 0;
            if (detachIfReset) {
            if (detachIfReset) {
                detach();
                detach();
            }
            }
@@ -1531,7 +1536,7 @@ public class BatteryStatsImpl extends BatteryStats {
        void readSummaryFromParcelLocked(Parcel in) {
        void readSummaryFromParcelLocked(Parcel in) {
            mLoadedCount = in.readLong();
            mLoadedCount = in.readLong();
            mCount = mLoadedCount;
            mCount = mLoadedCount;
            mUnpluggedCount = mPluggedCount = mLoadedCount;
            mUnpluggedCount = mLoadedCount;
        }
        }
    }
    }
@@ -3852,9 +3857,6 @@ public class BatteryStatsImpl extends BatteryStats {
                        + Display.stateToString(screenState)
                        + Display.stateToString(screenState)
                        + " and battery is " + (unplugged ? "on" : "off"));
                        + " and battery is " + (unplugged ? "on" : "off"));
            }
            }
            updateCpuTimeLocked();
            mExternalSync.scheduleCopyFromAllUidsCpuTimes(mOnBatteryTimeBase.isRunning(),
                    mOnBatteryScreenOffTimeBase.isRunning());
            mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime);
            mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime);
            if (updateOnBatteryTimeBase) {
            if (updateOnBatteryTimeBase) {
@@ -4143,15 +4145,11 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    }
    private void requestWakelockCpuUpdate() {
    private void requestWakelockCpuUpdate() {
        if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
        mExternalSync.scheduleCpuSyncDueToWakelockChange(DELAY_UPDATE_WAKELOCKS);
            Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
            mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
        }
    }
    }
    private void requestImmediateCpuUpdate() {
    private void requestImmediateCpuUpdate() {
        mHandler.removeMessages(MSG_UPDATE_WAKELOCKS);
        mExternalSync.scheduleCpuSyncDueToWakelockChange(0 /* delayMillis */);
        mHandler.sendEmptyMessage(MSG_UPDATE_WAKELOCKS);
    }
    }
    public void setRecordAllHistoryLocked(boolean enabled) {
    public void setRecordAllHistoryLocked(boolean enabled) {
@@ -4554,7 +4552,7 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    }
    public boolean startAddingCpuLocked() {
    public boolean startAddingCpuLocked() {
        mHandler.removeMessages(MSG_UPDATE_WAKELOCKS);
        mExternalSync.cancelCpuSyncDueToWakelockChange();
        return mOnBatteryInternal;
        return mOnBatteryInternal;
    }
    }
@@ -4807,6 +4805,8 @@ public class BatteryStatsImpl extends BatteryStats {
                        + Display.stateToString(state));
                        + Display.stateToString(state));
                addHistoryRecordLocked(elapsedRealtime, uptime);
                addHistoryRecordLocked(elapsedRealtime, uptime);
            }
            }
            mExternalSync.scheduleCpuSyncDueToScreenStateChange(
                    mOnBatteryTimeBase.isRunning(), mOnBatteryScreenOffTimeBase.isRunning());
            if (isScreenOn(state)) {
            if (isScreenOn(state)) {
                updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), state,
                updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), state,
                        mClocks.uptimeMillis() * 1000, elapsedRealtime * 1000);
                        mClocks.uptimeMillis() * 1000, elapsedRealtime * 1000);
@@ -9196,9 +9196,15 @@ public class BatteryStatsImpl extends BatteryStats {
            }
            }
            public void addCpuTimeLocked(int utime, int stime) {
            public void addCpuTimeLocked(int utime, int stime) {
                addCpuTimeLocked(utime, stime, mBsi.mOnBatteryTimeBase.isRunning());
            }
            public void addCpuTimeLocked(int utime, int stime, boolean isRunning) {
                if (isRunning) {
                    mUserTime += utime;
                    mUserTime += utime;
                    mSystemTime += stime;
                    mSystemTime += stime;
                }
                }
            }
            public void addForegroundTimeLocked(long ttime) {
            public void addForegroundTimeLocked(long ttime) {
                mForegroundTime += ttime;
                mForegroundTime += ttime;
@@ -11761,13 +11767,24 @@ public class BatteryStatsImpl extends BatteryStats {
        }
        }
    }
    }
    public boolean isOnBatteryLocked() {
        return mOnBatteryTimeBase.isRunning();
    }
    public boolean isOnBatteryScreenOffLocked() {
        return mOnBatteryScreenOffTimeBase.isRunning();
    }
    /**
    /**
     * Read and distribute CPU usage across apps. If their are partial wakelocks being held
     * Read and distribute CPU usage across apps. If their are partial wakelocks being held
     * and we are on battery with screen off, we give more of the cpu time to those apps holding
     * and we are on battery with screen off, we give more of the cpu time to those apps holding
     * wakelocks. If the screen is on, we just assign the actual cpu time an app used.
     * wakelocks. If the screen is on, we just assign the actual cpu time an app used.
     * It's possible this will be invoked after the internal battery/screen states are updated, so
     * passing the appropriate battery/screen states to try attribute the cpu times to correct
     * buckets.
     */
     */
    @GuardedBy("this")
    @GuardedBy("this")
    public void updateCpuTimeLocked() {
    public void updateCpuTimeLocked(boolean onBattery, boolean onBatteryScreenOff) {
        if (mPowerProfile == null) {
        if (mPowerProfile == null) {
            return;
            return;
        }
        }
@@ -11784,7 +11801,7 @@ public class BatteryStatsImpl extends BatteryStats {
        // usually holding the wakelock on behalf of an app.
        // usually holding the wakelock on behalf of an app.
        // And Only distribute cpu power to wakelocks if the screen is off and we're on battery.
        // And Only distribute cpu power to wakelocks if the screen is off and we're on battery.
        ArrayList<StopwatchTimer> partialTimersToConsider = null;
        ArrayList<StopwatchTimer> partialTimersToConsider = null;
        if (mOnBatteryScreenOffTimeBase.isRunning()) {
        if (onBatteryScreenOff) {
            partialTimersToConsider = new ArrayList<>();
            partialTimersToConsider = new ArrayList<>();
            for (int i = mPartialTimers.size() - 1; i >= 0; --i) {
            for (int i = mPartialTimers.size() - 1; i >= 0; --i) {
                final StopwatchTimer timer = mPartialTimers.get(i);
                final StopwatchTimer timer = mPartialTimers.get(i);
@@ -11802,7 +11819,7 @@ public class BatteryStatsImpl extends BatteryStats {
        // When the battery is not on, we don't attribute the cpu times to any timers but we still
        // When the battery is not on, we don't attribute the cpu times to any timers but we still
        // need to take the snapshots.
        // need to take the snapshots.
        if (!mOnBatteryInternal) {
        if (!onBattery) {
            mKernelUidCpuTimeReader.readDelta(null);
            mKernelUidCpuTimeReader.readDelta(null);
            mKernelUidCpuFreqTimeReader.readDelta(null);
            mKernelUidCpuFreqTimeReader.readDelta(null);
            if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) {
            if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) {
@@ -11818,16 +11835,16 @@ public class BatteryStatsImpl extends BatteryStats {
        mUserInfoProvider.refreshUserIds();
        mUserInfoProvider.refreshUserIds();
        final SparseLongArray updatedUids = mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()
        final SparseLongArray updatedUids = mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()
                ? null : new SparseLongArray();
                ? null : new SparseLongArray();
        readKernelUidCpuTimesLocked(partialTimersToConsider, updatedUids);
        readKernelUidCpuTimesLocked(partialTimersToConsider, updatedUids, onBattery);
        // updatedUids=null means /proc/uid_time_in_state provides snapshots of per-cluster cpu
        // updatedUids=null means /proc/uid_time_in_state provides snapshots of per-cluster cpu
        // freqs, so no need to approximate these values.
        // freqs, so no need to approximate these values.
        if (updatedUids != null) {
        if (updatedUids != null) {
            updateClusterSpeedTimes(updatedUids);
            updateClusterSpeedTimes(updatedUids, onBattery);
        }
        }
        readKernelUidCpuFreqTimesLocked(partialTimersToConsider);
        readKernelUidCpuFreqTimesLocked(partialTimersToConsider, onBattery, onBatteryScreenOff);
        if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) {
        if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) {
            readKernelUidCpuActiveTimesLocked();
            readKernelUidCpuActiveTimesLocked(onBattery);
            readKernelUidCpuClusterTimesLocked();
            readKernelUidCpuClusterTimesLocked(onBattery);
        }
        }
    }
    }
@@ -11867,7 +11884,7 @@ public class BatteryStatsImpl extends BatteryStats {
     * @param updatedUids The uids for which times spent at different frequencies are calculated.
     * @param updatedUids The uids for which times spent at different frequencies are calculated.
     */
     */
    @VisibleForTesting
    @VisibleForTesting
    public void updateClusterSpeedTimes(@NonNull SparseLongArray updatedUids) {
    public void updateClusterSpeedTimes(@NonNull SparseLongArray updatedUids, boolean onBattery) {
        long totalCpuClustersTimeMs = 0;
        long totalCpuClustersTimeMs = 0;
        // Read the time spent for each cluster at various cpu frequencies.
        // Read the time spent for each cluster at various cpu frequencies.
        final long[][] clusterSpeedTimesMs = new long[mKernelCpuSpeedReaders.length][];
        final long[][] clusterSpeedTimesMs = new long[mKernelCpuSpeedReaders.length][];
@@ -11909,7 +11926,7 @@ public class BatteryStatsImpl extends BatteryStats {
                        }
                        }
                        cpuSpeeds[speed].addCountLocked(appCpuTimeUs
                        cpuSpeeds[speed].addCountLocked(appCpuTimeUs
                                * clusterSpeedTimesMs[cluster][speed]
                                * clusterSpeedTimesMs[cluster][speed]
                                / totalCpuClustersTimeMs);
                                / totalCpuClustersTimeMs, onBattery);
                    }
                    }
                }
                }
            }
            }
@@ -11926,7 +11943,7 @@ public class BatteryStatsImpl extends BatteryStats {
     */
     */
    @VisibleForTesting
    @VisibleForTesting
    public void readKernelUidCpuTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers,
    public void readKernelUidCpuTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers,
            @Nullable SparseLongArray updatedUids) {
            @Nullable SparseLongArray updatedUids, boolean onBattery) {
        mTempTotalCpuUserTimeUs = mTempTotalCpuSystemTimeUs = 0;
        mTempTotalCpuUserTimeUs = mTempTotalCpuSystemTimeUs = 0;
        final int numWakelocks = partialTimers == null ? 0 : partialTimers.size();
        final int numWakelocks = partialTimers == null ? 0 : partialTimers.size();
        final long startTimeMs = mClocks.uptimeMillis();
        final long startTimeMs = mClocks.uptimeMillis();
@@ -11977,8 +11994,8 @@ public class BatteryStatsImpl extends BatteryStats {
                Slog.d(TAG, sb.toString());
                Slog.d(TAG, sb.toString());
            }
            }
            u.mUserCpuTime.addCountLocked(userTimeUs);
            u.mUserCpuTime.addCountLocked(userTimeUs, onBattery);
            u.mSystemCpuTime.addCountLocked(systemTimeUs);
            u.mSystemCpuTime.addCountLocked(systemTimeUs, onBattery);
            if (updatedUids != null) {
            if (updatedUids != null) {
                updatedUids.put(u.getUid(), userTimeUs + systemTimeUs);
                updatedUids.put(u.getUid(), userTimeUs + systemTimeUs);
            }
            }
@@ -12010,15 +12027,15 @@ public class BatteryStatsImpl extends BatteryStats {
                    Slog.d(TAG, sb.toString());
                    Slog.d(TAG, sb.toString());
                }
                }
                timer.mUid.mUserCpuTime.addCountLocked(userTimeUs);
                timer.mUid.mUserCpuTime.addCountLocked(userTimeUs, onBattery);
                timer.mUid.mSystemCpuTime.addCountLocked(systemTimeUs);
                timer.mUid.mSystemCpuTime.addCountLocked(systemTimeUs, onBattery);
                if (updatedUids != null) {
                if (updatedUids != null) {
                    final int uid = timer.mUid.getUid();
                    final int uid = timer.mUid.getUid();
                    updatedUids.put(uid, updatedUids.get(uid, 0) + userTimeUs + systemTimeUs);
                    updatedUids.put(uid, updatedUids.get(uid, 0) + userTimeUs + systemTimeUs);
                }
                }
                final Uid.Proc proc = timer.mUid.getProcessStatsLocked("*wakelock*");
                final Uid.Proc proc = timer.mUid.getProcessStatsLocked("*wakelock*");
                proc.addCpuTimeLocked(userTimeUs / 1000, systemTimeUs / 1000);
                proc.addCpuTimeLocked(userTimeUs / 1000, systemTimeUs / 1000, onBattery);
                mTempTotalCpuUserTimeUs -= userTimeUs;
                mTempTotalCpuUserTimeUs -= userTimeUs;
                mTempTotalCpuSystemTimeUs -= systemTimeUs;
                mTempTotalCpuSystemTimeUs -= systemTimeUs;
@@ -12033,7 +12050,8 @@ public class BatteryStatsImpl extends BatteryStats {
     * @param partialTimers The wakelock holders among which the cpu freq times will be distributed.
     * @param partialTimers The wakelock holders among which the cpu freq times will be distributed.
     */
     */
    @VisibleForTesting
    @VisibleForTesting
    public void readKernelUidCpuFreqTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers) {
    public void readKernelUidCpuFreqTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers,
            boolean onBattery, boolean onBatteryScreenOff) {
        final boolean perClusterTimesAvailable =
        final boolean perClusterTimesAvailable =
                mKernelUidCpuFreqTimeReader.perClusterTimesAvailable();
                mKernelUidCpuFreqTimeReader.perClusterTimesAvailable();
        final int numWakelocks = partialTimers == null ? 0 : partialTimers.size();
        final int numWakelocks = partialTimers == null ? 0 : partialTimers.size();
@@ -12056,13 +12074,13 @@ public class BatteryStatsImpl extends BatteryStats {
            if (u.mCpuFreqTimeMs == null || u.mCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) {
            if (u.mCpuFreqTimeMs == null || u.mCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) {
                u.mCpuFreqTimeMs = new LongSamplingCounterArray(mOnBatteryTimeBase);
                u.mCpuFreqTimeMs = new LongSamplingCounterArray(mOnBatteryTimeBase);
            }
            }
            u.mCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs);
            u.mCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs, onBattery);
            if (u.mScreenOffCpuFreqTimeMs == null ||
            if (u.mScreenOffCpuFreqTimeMs == null ||
                    u.mScreenOffCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) {
                    u.mScreenOffCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) {
                u.mScreenOffCpuFreqTimeMs = new LongSamplingCounterArray(
                u.mScreenOffCpuFreqTimeMs = new LongSamplingCounterArray(
                        mOnBatteryScreenOffTimeBase);
                        mOnBatteryScreenOffTimeBase);
            }
            }
            u.mScreenOffCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs);
            u.mScreenOffCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs, onBatteryScreenOff);
            if (perClusterTimesAvailable) {
            if (perClusterTimesAvailable) {
                if (u.mCpuClusterSpeedTimesUs == null ||
                if (u.mCpuClusterSpeedTimesUs == null ||
@@ -12098,7 +12116,7 @@ public class BatteryStatsImpl extends BatteryStats {
                        } else {
                        } else {
                            appAllocationUs = cpuFreqTimeMs[freqIndex] * 1000;
                            appAllocationUs = cpuFreqTimeMs[freqIndex] * 1000;
                        }
                        }
                        cpuTimesUs[speed].addCountLocked(appAllocationUs);
                        cpuTimesUs[speed].addCountLocked(appAllocationUs, onBattery);
                        freqIndex++;
                        freqIndex++;
                    }
                    }
                }
                }
@@ -12132,7 +12150,7 @@ public class BatteryStatsImpl extends BatteryStats {
                        }
                        }
                        final long allocationUs =
                        final long allocationUs =
                                mWakeLockAllocationsUs[cluster][speed] / (numWakelocks - i);
                                mWakeLockAllocationsUs[cluster][speed] / (numWakelocks - i);
                        cpuTimeUs[speed].addCountLocked(allocationUs);
                        cpuTimeUs[speed].addCountLocked(allocationUs, onBattery);
                        mWakeLockAllocationsUs[cluster][speed] -= allocationUs;
                        mWakeLockAllocationsUs[cluster][speed] -= allocationUs;
                    }
                    }
                }
                }
@@ -12145,7 +12163,7 @@ public class BatteryStatsImpl extends BatteryStats {
     * counters.
     * counters.
     */
     */
    @VisibleForTesting
    @VisibleForTesting
    public void readKernelUidCpuActiveTimesLocked() {
    public void readKernelUidCpuActiveTimesLocked(boolean onBattery) {
        final long startTimeMs = mClocks.uptimeMillis();
        final long startTimeMs = mClocks.uptimeMillis();
        mKernelUidCpuActiveTimeReader.readDelta((uid, cpuActiveTimesUs) -> {
        mKernelUidCpuActiveTimeReader.readDelta((uid, cpuActiveTimesUs) -> {
            uid = mapUid(uid);
            uid = mapUid(uid);
@@ -12160,7 +12178,7 @@ public class BatteryStatsImpl extends BatteryStats {
                return;
                return;
            }
            }
            final Uid u = getUidStatsLocked(uid);
            final Uid u = getUidStatsLocked(uid);
            u.mCpuActiveTimeMs.addCountLocked(cpuActiveTimesUs);
            u.mCpuActiveTimeMs.addCountLocked(cpuActiveTimesUs, onBattery);
        });
        });
        final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs;
        final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs;
@@ -12174,7 +12192,7 @@ public class BatteryStatsImpl extends BatteryStats {
     * counters.
     * counters.
     */
     */
    @VisibleForTesting
    @VisibleForTesting
    public void readKernelUidCpuClusterTimesLocked() {
    public void readKernelUidCpuClusterTimesLocked(boolean onBattery) {
        final long startTimeMs = mClocks.uptimeMillis();
        final long startTimeMs = mClocks.uptimeMillis();
        mKernelUidCpuClusterTimeReader.readDelta((uid, cpuClusterTimesUs) -> {
        mKernelUidCpuClusterTimeReader.readDelta((uid, cpuClusterTimesUs) -> {
            uid = mapUid(uid);
            uid = mapUid(uid);
@@ -12189,7 +12207,7 @@ public class BatteryStatsImpl extends BatteryStats {
                return;
                return;
            }
            }
            final Uid u = getUidStatsLocked(uid);
            final Uid u = getUidStatsLocked(uid);
            u.mCpuClusterTimesMs.addCountLocked(cpuClusterTimesUs);
            u.mCpuClusterTimesMs.addCountLocked(cpuClusterTimesUs, onBattery);
        });
        });
        final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs;
        final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs;
@@ -12399,9 +12417,7 @@ public class BatteryStatsImpl extends BatteryStats {
        reportChangesToStatsLog(mHaveBatteryLevel ? mHistoryCur : null,
        reportChangesToStatsLog(mHaveBatteryLevel ? mHistoryCur : null,
                status, plugType, level, temp);
                status, plugType, level, temp);
        final boolean onBattery =
        final boolean onBattery = isOnBattery(plugType, status);
            plugType == BATTERY_PLUGGED_NONE &&
            status != BatteryManager.BATTERY_STATUS_UNKNOWN;
        final long uptime = mClocks.uptimeMillis();
        final long uptime = mClocks.uptimeMillis();
        final long elapsedRealtime = mClocks.elapsedRealtime();
        final long elapsedRealtime = mClocks.elapsedRealtime();
        if (!mHaveBatteryLevel) {
        if (!mHaveBatteryLevel) {
@@ -12591,6 +12607,10 @@ public class BatteryStatsImpl extends BatteryStats {
        mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh);
        mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh);
    }
    }
    public static boolean isOnBattery(int plugType, int status) {
        return plugType == BATTERY_PLUGGED_NONE && status != BatteryManager.BATTERY_STATUS_UNKNOWN;
    }
    // Inform StatsLog of setBatteryState changes.
    // Inform StatsLog of setBatteryState changes.
    // If this is the first reporting, pass in recentPast == null.
    // If this is the first reporting, pass in recentPast == null.
    private void reportChangesToStatsLog(HistoryItem recentPast,
    private void reportChangesToStatsLog(HistoryItem recentPast,
+23 −23
Original line number Original line Diff line number Diff line
@@ -114,7 +114,7 @@ public class BatteryStatsCpuTimesTest {
        when(mKernelUidCpuFreqTimeReader.readFreqs(mPowerProfile)).thenReturn(freqs);
        when(mKernelUidCpuFreqTimeReader.readFreqs(mPowerProfile)).thenReturn(freqs);


        // RUN
        // RUN
        mBatteryStatsImpl.updateCpuTimeLocked();
        mBatteryStatsImpl.updateCpuTimeLocked(false, false);


        // VERIFY
        // VERIFY
        assertArrayEquals("Unexpected cpu freqs", freqs, mBatteryStatsImpl.getCpuFreqs());
        assertArrayEquals("Unexpected cpu freqs", freqs, mBatteryStatsImpl.getCpuFreqs());
@@ -134,7 +134,7 @@ public class BatteryStatsCpuTimesTest {
        mBatteryStatsImpl.setOnBatteryInternal(true);
        mBatteryStatsImpl.setOnBatteryInternal(true);


        // RUN
        // RUN
        mBatteryStatsImpl.updateCpuTimeLocked();
        mBatteryStatsImpl.updateCpuTimeLocked(true, false);


        // VERIFY
        // VERIFY
        verify(mUserInfoProvider).refreshUserIds();
        verify(mUserInfoProvider).refreshUserIds();
@@ -213,7 +213,7 @@ public class BatteryStatsCpuTimesTest {
        }
        }


        // RUN
        // RUN
        mBatteryStatsImpl.updateClusterSpeedTimes(updatedUids);
        mBatteryStatsImpl.updateClusterSpeedTimes(updatedUids, true);


        // VERIFY
        // VERIFY
        int totalClustersTimeMs = 0;
        int totalClustersTimeMs = 0;
@@ -261,7 +261,7 @@ public class BatteryStatsCpuTimesTest {


        // RUN
        // RUN
        final SparseLongArray updatedUids = new SparseLongArray();
        final SparseLongArray updatedUids = new SparseLongArray();
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, updatedUids);
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, updatedUids, true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -294,7 +294,7 @@ public class BatteryStatsCpuTimesTest {
        }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class));
        }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null);
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -333,7 +333,7 @@ public class BatteryStatsCpuTimesTest {
        }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class));
        }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null);
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -368,7 +368,7 @@ public class BatteryStatsCpuTimesTest {
        }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class));
        }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null);
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -423,7 +423,7 @@ public class BatteryStatsCpuTimesTest {
        }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class));
        }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null);
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -470,7 +470,7 @@ public class BatteryStatsCpuTimesTest {


        // RUN
        // RUN
        final SparseLongArray updatedUids = new SparseLongArray();
        final SparseLongArray updatedUids = new SparseLongArray();
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(partialTimers, updatedUids);
        mBatteryStatsImpl.readKernelUidCpuTimesLocked(partialTimers, updatedUids, true);


        // VERIFY
        // VERIFY
        long totalUserTimeUs = 0;
        long totalUserTimeUs = 0;
@@ -549,7 +549,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuFreqTimeReader.Callback.class));
                any(KernelUidCpuFreqTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -582,7 +582,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuFreqTimeReader.Callback.class));
                any(KernelUidCpuFreqTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -633,7 +633,7 @@ public class BatteryStatsCpuTimesTest {
        when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true);
        when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true);


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -676,7 +676,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuFreqTimeReader.Callback.class));
                any(KernelUidCpuFreqTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -743,7 +743,7 @@ public class BatteryStatsCpuTimesTest {
        when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true);
        when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true);


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(partialTimers);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(partialTimers, true, false);


        // VERIFY
        // VERIFY
        final long[][] expectedWakeLockUidTimesUs = new long[clusterFreqs.length][];
        final long[][] expectedWakeLockUidTimesUs = new long[clusterFreqs.length][];
@@ -832,7 +832,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuFreqTimeReader.Callback.class));
                any(KernelUidCpuFreqTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -865,7 +865,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuFreqTimeReader.Callback.class));
                any(KernelUidCpuFreqTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -909,7 +909,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuFreqTimeReader.Callback.class));
                any(KernelUidCpuFreqTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -949,7 +949,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuFreqTimeReader.Callback.class));
                any(KernelUidCpuFreqTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -1006,7 +1006,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuFreqTimeReader.Callback.class));
                any(KernelUidCpuFreqTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null);
        mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -1047,7 +1047,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuActiveTimeReader.Callback.class));
                any(KernelUidCpuActiveTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked();
        mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -1073,7 +1073,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuActiveTimeReader.Callback.class));
                any(KernelUidCpuActiveTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked();
        mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -1112,7 +1112,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuClusterTimeReader.Callback.class));
                any(KernelUidCpuClusterTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked();
        mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
@@ -1142,7 +1142,7 @@ public class BatteryStatsCpuTimesTest {
                any(KernelUidCpuClusterTimeReader.Callback.class));
                any(KernelUidCpuClusterTimeReader.Callback.class));


        // RUN
        // RUN
        mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked();
        mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(true);


        // VERIFY
        // VERIFY
        for (int i = 0; i < testUids.length; ++i) {
        for (int i = 0; i < testUids.length; ++i) {
+3 −4
Original line number Original line Diff line number Diff line
@@ -161,9 +161,7 @@ public class BatteryStatsNoteTest extends TestCase {


        actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE,
        actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE,
                elapsedTimeUs, STATS_SINCE_CHARGED);
                elapsedTimeUs, STATS_SINCE_CHARGED);
        expectedRunTimeMs = stateRuntimeMap.get(
        expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
                ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE)
                + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
        assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);
        assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);


        actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING,
        actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING,
@@ -173,7 +171,8 @@ public class BatteryStatsNoteTest extends TestCase {


        actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND,
        actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND,
                elapsedTimeUs, STATS_SINCE_CHARGED);
                elapsedTimeUs, STATS_SINCE_CHARGED);
        expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
        expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)
                + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
        assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);
        assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);


        actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND,
        actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND,
+14 −0
Original line number Original line Diff line number Diff line
@@ -171,6 +171,20 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {
            return null;
            return null;
        }
        }


        @Override
        public Future<?> scheduleCpuSyncDueToScreenStateChange(
                boolean onBattery, boolean onBatteryScreenOff) {
            return null;
        }

        @Override
        public Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis) {
            return null;
        }

        @Override
        public void cancelCpuSyncDueToWakelockChange() {
        }
    }
    }
}
}
+85 −9

File changed.

Preview size limit exceeded, changes collapsed.

Loading