Loading core/java/com/android/internal/os/BatteryStatsImpl.java +65 −24 Original line number Diff line number Diff line Loading @@ -491,7 +491,8 @@ public class BatteryStatsImpl extends BatteryStats { isolatedUidTimeInFreqCounters = new LongArrayMultiStateCounter[childUidCount]; for (int j = childUidCount - 1; j >= 0; --j) { isolatedUids[j] = u.mChildUids.keyAt(j); isolatedUidTimeInFreqCounters[j] = u.mChildUids.valueAt(j); isolatedUidTimeInFreqCounters[j] = u.mChildUids.valueAt(j).cpuTimeInFreqCounter; } } } Loading Loading @@ -574,7 +575,8 @@ public class BatteryStatsImpl extends BatteryStats { } for (int i = allUidCpuFreqTimesMs.size() - 1; i >= 0; --i) { final int uid = allUidCpuFreqTimesMs.keyAt(i); final Uid u = getAvailableUidStatsLocked(mapUid(uid)); final int parentUid = mapUid(uid); final Uid u = getAvailableUidStatsLocked(parentUid); if (u == null) { continue; } Loading @@ -599,16 +601,22 @@ public class BatteryStatsImpl extends BatteryStats { u.getProcStateScreenOffTimeCounter().getCounter(); onBatteryCounter.setState(procState, timestampMs); if (uid == parentUid) { mKernelSingleUidTimeReader.addDelta(uid, onBatteryCounter, timestampMs); } onBatteryScreenOffCounter.setState(procState, timestampMs); mKernelSingleUidTimeReader.addDelta(uid, onBatteryScreenOffCounter, timestampMs); if (uid == parentUid) { mKernelSingleUidTimeReader.addDelta(uid, onBatteryScreenOffCounter, timestampMs); } if (u.mChildUids != null) { final LongArrayMultiStateCounter.LongArrayContainer deltaContainer = new LongArrayMultiStateCounter.LongArrayContainer(getCpuFreqCount()); for (int j = u.mChildUids.size() - 1; j >= 0; --j) { final LongArrayMultiStateCounter counter = u.mChildUids.valueAt(j); final LongArrayMultiStateCounter counter = u.mChildUids.valueAt(j).cpuTimeInFreqCounter; if (counter != null) { final int isolatedUid = u.mChildUids.keyAt(j); mKernelSingleUidTimeReader.addDelta(isolatedUid, Loading Loading @@ -1836,8 +1844,12 @@ public class BatteryStatsImpl extends BatteryStats { mCounter.setState(processState, elapsedRealtimeMs); } private void update(long value, long timestampMs) { mCounter.updateValue(value, timestampMs); private long update(long value, long timestampMs) { return mCounter.updateValue(value, timestampMs); } public void addCount(long delta) { mCounter.addCount(delta); } /** Loading Loading @@ -8116,7 +8128,7 @@ public class BatteryStatsImpl extends BatteryStats { TimeInFreqMultiStateCounter mProcStateTimeMs; TimeInFreqMultiStateCounter mProcStateScreenOffTimeMs; SparseArray<LongArrayMultiStateCounter> mChildUids; SparseArray<ChildUid> mChildUids; /** * The statistics we have collected for this uid's wake locks. Loading Loading @@ -8386,18 +8398,7 @@ public class BatteryStatsImpl extends BatteryStats { } else if (mChildUids.indexOfKey(isolatedUid) >= 0) { return; } if (mBsi.trackPerProcStateCpuTimes()) { LongArrayMultiStateCounter counter = new LongArrayMultiStateCounter(1, mBsi.getCpuFreqCount()); // Set initial values to all 0. This is a child UID and we want to include // the entirety of its CPU time-in-freq stats into the parent's stats. counter.updateValues( new LongArrayMultiStateCounter.LongArrayContainer(mBsi.getCpuFreqCount()), mBsi.mClock.elapsedRealtime()); mChildUids.put(isolatedUid, counter); } else { mChildUids.put(isolatedUid, null); } mChildUids.put(isolatedUid, new ChildUid()); } public void removeIsolatedUid(int isolatedUid) { Loading Loading @@ -11196,6 +11197,32 @@ public class BatteryStatsImpl extends BatteryStats { } } private class ChildUid { public final TimeMultiStateCounter cpuActiveCounter; public final LongArrayMultiStateCounter cpuTimeInFreqCounter; ChildUid() { final long timestampMs = mBsi.mClock.elapsedRealtime(); cpuActiveCounter = new TimeMultiStateCounter(mBsi.mOnBatteryTimeBase, 1, timestampMs); cpuActiveCounter.setState(0, timestampMs); if (mBsi.trackPerProcStateCpuTimes()) { final int cpuFreqCount = mBsi.getCpuFreqCount(); cpuTimeInFreqCounter = new LongArrayMultiStateCounter(1, cpuFreqCount); // Set initial values to all 0. This is a child UID and we want to include // the entirety of its CPU time-in-freq stats into the parent's stats. cpuTimeInFreqCounter.updateValues( new LongArrayMultiStateCounter.LongArrayContainer(cpuFreqCount), timestampMs); } else { cpuTimeInFreqCounter = null; } } } /** * Retrieve the statistics object for a particular process, creating * if needed. Loading Loading @@ -14474,8 +14501,8 @@ public class BatteryStatsImpl extends BatteryStats { final long startTimeMs = mClock.uptimeMillis(); final long elapsedRealtimeMs = mClock.elapsedRealtime(); mCpuUidActiveTimeReader.readAbsolute((uid, cpuActiveTimesMs) -> { uid = mapUid(uid); if (Process.isIsolated(uid)) { final int parentUid = mapUid(uid); if (Process.isIsolated(parentUid)) { if (DEBUG) Slog.w(TAG, "Got active times for an isolated uid: " + uid); return; } Loading @@ -14483,8 +14510,22 @@ public class BatteryStatsImpl extends BatteryStats { if (DEBUG) Slog.w(TAG, "Got active times for an invalid user's uid " + uid); return; } final Uid u = getUidStatsLocked(uid, elapsedRealtimeMs, startTimeMs); u.getCpuActiveTimeCounter().update(cpuActiveTimesMs, mClock.elapsedRealtime()); final Uid u = getUidStatsLocked(parentUid, elapsedRealtimeMs, startTimeMs); if (parentUid == uid) { u.getCpuActiveTimeCounter().update(cpuActiveTimesMs, elapsedRealtimeMs); } else { final SparseArray<Uid.ChildUid> childUids = u.mChildUids; if (childUids == null) { return; } Uid.ChildUid childUid = childUids.get(uid); if (childUid != null) { final long delta = childUid.cpuActiveCounter.update(cpuActiveTimesMs, elapsedRealtimeMs); u.getCpuActiveTimeCounter().addCount(delta); } } }); final long elapsedTimeMs = mClock.uptimeMillis() - startTimeMs; core/java/com/android/internal/os/LongMultiStateCounter.java +7 −5 Original line number Diff line number Diff line Loading @@ -109,12 +109,14 @@ public final class LongMultiStateCounter implements Parcelable { } /** * Sets the new values. The delta between the previously set values and these values * Sets the new values. The delta between the previously set value and this value * is distributed among the state according to the time the object spent in those states * since the previous call to updateValues. * since the previous call to updateValue. * * @return The delta between the previous value and the new value. */ public void updateValue(long value, long timestampMs) { native_updateValue(mNativeObject, value, timestampMs); public long updateValue(long value, long timestampMs) { return native_updateValue(mNativeObject, value, timestampMs); } /** Loading Loading @@ -185,7 +187,7 @@ public final class LongMultiStateCounter implements Parcelable { private static native void native_setState(long nativeObject, int state, long timestampMs); @CriticalNative private static native void native_updateValue(long nativeObject, long value, long timestampMs); private static native long native_updateValue(long nativeObject, long value, long timestampMs); @CriticalNative private static native void native_addCount(long nativeObject, long count); Loading core/jni/com_android_internal_os_LongMultiStateCounter.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -80,8 +80,8 @@ static void native_setState(jlong nativePtr, jint state, jlong timestamp) { asLongMultiStateCounter(nativePtr)->setState(state, timestamp); } static void native_updateValue(jlong nativePtr, jlong value, jlong timestamp) { asLongMultiStateCounter(nativePtr)->updateValue((int64_t)value, timestamp); static jlong native_updateValue(jlong nativePtr, jlong value, jlong timestamp) { return (jlong)asLongMultiStateCounter(nativePtr)->updateValue((int64_t)value, timestamp); } static void native_addCount(jlong nativePtr, jlong count) { Loading Loading @@ -170,7 +170,7 @@ static const JNINativeMethod g_methods[] = { // @CriticalNative {"native_setState", "(JIJ)V", (void *)native_setState}, // @CriticalNative {"native_updateValue", "(JJJ)V", (void *)native_updateValue}, {"native_updateValue", "(JJJ)J", (void *)native_updateValue}, // @CriticalNative {"native_addCount", "(JJ)V", (void *)native_addCount}, // @CriticalNative Loading Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +65 −24 Original line number Diff line number Diff line Loading @@ -491,7 +491,8 @@ public class BatteryStatsImpl extends BatteryStats { isolatedUidTimeInFreqCounters = new LongArrayMultiStateCounter[childUidCount]; for (int j = childUidCount - 1; j >= 0; --j) { isolatedUids[j] = u.mChildUids.keyAt(j); isolatedUidTimeInFreqCounters[j] = u.mChildUids.valueAt(j); isolatedUidTimeInFreqCounters[j] = u.mChildUids.valueAt(j).cpuTimeInFreqCounter; } } } Loading Loading @@ -574,7 +575,8 @@ public class BatteryStatsImpl extends BatteryStats { } for (int i = allUidCpuFreqTimesMs.size() - 1; i >= 0; --i) { final int uid = allUidCpuFreqTimesMs.keyAt(i); final Uid u = getAvailableUidStatsLocked(mapUid(uid)); final int parentUid = mapUid(uid); final Uid u = getAvailableUidStatsLocked(parentUid); if (u == null) { continue; } Loading @@ -599,16 +601,22 @@ public class BatteryStatsImpl extends BatteryStats { u.getProcStateScreenOffTimeCounter().getCounter(); onBatteryCounter.setState(procState, timestampMs); if (uid == parentUid) { mKernelSingleUidTimeReader.addDelta(uid, onBatteryCounter, timestampMs); } onBatteryScreenOffCounter.setState(procState, timestampMs); mKernelSingleUidTimeReader.addDelta(uid, onBatteryScreenOffCounter, timestampMs); if (uid == parentUid) { mKernelSingleUidTimeReader.addDelta(uid, onBatteryScreenOffCounter, timestampMs); } if (u.mChildUids != null) { final LongArrayMultiStateCounter.LongArrayContainer deltaContainer = new LongArrayMultiStateCounter.LongArrayContainer(getCpuFreqCount()); for (int j = u.mChildUids.size() - 1; j >= 0; --j) { final LongArrayMultiStateCounter counter = u.mChildUids.valueAt(j); final LongArrayMultiStateCounter counter = u.mChildUids.valueAt(j).cpuTimeInFreqCounter; if (counter != null) { final int isolatedUid = u.mChildUids.keyAt(j); mKernelSingleUidTimeReader.addDelta(isolatedUid, Loading Loading @@ -1836,8 +1844,12 @@ public class BatteryStatsImpl extends BatteryStats { mCounter.setState(processState, elapsedRealtimeMs); } private void update(long value, long timestampMs) { mCounter.updateValue(value, timestampMs); private long update(long value, long timestampMs) { return mCounter.updateValue(value, timestampMs); } public void addCount(long delta) { mCounter.addCount(delta); } /** Loading Loading @@ -8116,7 +8128,7 @@ public class BatteryStatsImpl extends BatteryStats { TimeInFreqMultiStateCounter mProcStateTimeMs; TimeInFreqMultiStateCounter mProcStateScreenOffTimeMs; SparseArray<LongArrayMultiStateCounter> mChildUids; SparseArray<ChildUid> mChildUids; /** * The statistics we have collected for this uid's wake locks. Loading Loading @@ -8386,18 +8398,7 @@ public class BatteryStatsImpl extends BatteryStats { } else if (mChildUids.indexOfKey(isolatedUid) >= 0) { return; } if (mBsi.trackPerProcStateCpuTimes()) { LongArrayMultiStateCounter counter = new LongArrayMultiStateCounter(1, mBsi.getCpuFreqCount()); // Set initial values to all 0. This is a child UID and we want to include // the entirety of its CPU time-in-freq stats into the parent's stats. counter.updateValues( new LongArrayMultiStateCounter.LongArrayContainer(mBsi.getCpuFreqCount()), mBsi.mClock.elapsedRealtime()); mChildUids.put(isolatedUid, counter); } else { mChildUids.put(isolatedUid, null); } mChildUids.put(isolatedUid, new ChildUid()); } public void removeIsolatedUid(int isolatedUid) { Loading Loading @@ -11196,6 +11197,32 @@ public class BatteryStatsImpl extends BatteryStats { } } private class ChildUid { public final TimeMultiStateCounter cpuActiveCounter; public final LongArrayMultiStateCounter cpuTimeInFreqCounter; ChildUid() { final long timestampMs = mBsi.mClock.elapsedRealtime(); cpuActiveCounter = new TimeMultiStateCounter(mBsi.mOnBatteryTimeBase, 1, timestampMs); cpuActiveCounter.setState(0, timestampMs); if (mBsi.trackPerProcStateCpuTimes()) { final int cpuFreqCount = mBsi.getCpuFreqCount(); cpuTimeInFreqCounter = new LongArrayMultiStateCounter(1, cpuFreqCount); // Set initial values to all 0. This is a child UID and we want to include // the entirety of its CPU time-in-freq stats into the parent's stats. cpuTimeInFreqCounter.updateValues( new LongArrayMultiStateCounter.LongArrayContainer(cpuFreqCount), timestampMs); } else { cpuTimeInFreqCounter = null; } } } /** * Retrieve the statistics object for a particular process, creating * if needed. Loading Loading @@ -14474,8 +14501,8 @@ public class BatteryStatsImpl extends BatteryStats { final long startTimeMs = mClock.uptimeMillis(); final long elapsedRealtimeMs = mClock.elapsedRealtime(); mCpuUidActiveTimeReader.readAbsolute((uid, cpuActiveTimesMs) -> { uid = mapUid(uid); if (Process.isIsolated(uid)) { final int parentUid = mapUid(uid); if (Process.isIsolated(parentUid)) { if (DEBUG) Slog.w(TAG, "Got active times for an isolated uid: " + uid); return; } Loading @@ -14483,8 +14510,22 @@ public class BatteryStatsImpl extends BatteryStats { if (DEBUG) Slog.w(TAG, "Got active times for an invalid user's uid " + uid); return; } final Uid u = getUidStatsLocked(uid, elapsedRealtimeMs, startTimeMs); u.getCpuActiveTimeCounter().update(cpuActiveTimesMs, mClock.elapsedRealtime()); final Uid u = getUidStatsLocked(parentUid, elapsedRealtimeMs, startTimeMs); if (parentUid == uid) { u.getCpuActiveTimeCounter().update(cpuActiveTimesMs, elapsedRealtimeMs); } else { final SparseArray<Uid.ChildUid> childUids = u.mChildUids; if (childUids == null) { return; } Uid.ChildUid childUid = childUids.get(uid); if (childUid != null) { final long delta = childUid.cpuActiveCounter.update(cpuActiveTimesMs, elapsedRealtimeMs); u.getCpuActiveTimeCounter().addCount(delta); } } }); final long elapsedTimeMs = mClock.uptimeMillis() - startTimeMs;
core/java/com/android/internal/os/LongMultiStateCounter.java +7 −5 Original line number Diff line number Diff line Loading @@ -109,12 +109,14 @@ public final class LongMultiStateCounter implements Parcelable { } /** * Sets the new values. The delta between the previously set values and these values * Sets the new values. The delta between the previously set value and this value * is distributed among the state according to the time the object spent in those states * since the previous call to updateValues. * since the previous call to updateValue. * * @return The delta between the previous value and the new value. */ public void updateValue(long value, long timestampMs) { native_updateValue(mNativeObject, value, timestampMs); public long updateValue(long value, long timestampMs) { return native_updateValue(mNativeObject, value, timestampMs); } /** Loading Loading @@ -185,7 +187,7 @@ public final class LongMultiStateCounter implements Parcelable { private static native void native_setState(long nativeObject, int state, long timestampMs); @CriticalNative private static native void native_updateValue(long nativeObject, long value, long timestampMs); private static native long native_updateValue(long nativeObject, long value, long timestampMs); @CriticalNative private static native void native_addCount(long nativeObject, long count); Loading
core/jni/com_android_internal_os_LongMultiStateCounter.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -80,8 +80,8 @@ static void native_setState(jlong nativePtr, jint state, jlong timestamp) { asLongMultiStateCounter(nativePtr)->setState(state, timestamp); } static void native_updateValue(jlong nativePtr, jlong value, jlong timestamp) { asLongMultiStateCounter(nativePtr)->updateValue((int64_t)value, timestamp); static jlong native_updateValue(jlong nativePtr, jlong value, jlong timestamp) { return (jlong)asLongMultiStateCounter(nativePtr)->updateValue((int64_t)value, timestamp); } static void native_addCount(jlong nativePtr, jlong count) { Loading Loading @@ -170,7 +170,7 @@ static const JNINativeMethod g_methods[] = { // @CriticalNative {"native_setState", "(JIJ)V", (void *)native_setState}, // @CriticalNative {"native_updateValue", "(JJJ)V", (void *)native_updateValue}, {"native_updateValue", "(JJJ)J", (void *)native_updateValue}, // @CriticalNative {"native_addCount", "(JJ)V", (void *)native_addCount}, // @CriticalNative Loading