Loading core/java/android/os/BatteryStats.java +28 −9 Original line number Diff line number Diff line Loading @@ -425,6 +425,24 @@ public abstract class BatteryStats implements Parcelable { public abstract long getMobileRadioActiveTime(int which); public abstract int getMobileRadioActiveCount(int which); /** * Get the total cpu time (in microseconds) this UID had processes executing in userspace. */ public abstract long getUserCpuTimeUs(int which); /** * Get the total cpu time (in microseconds) this UID had processes executing kernel syscalls. */ public abstract long getSystemCpuTimeUs(int which); /** * Returns the approximate cpu time (in milliseconds) spent at a certain CPU speed. * @param speedStep the index of the CPU speed. This is not the actual speed of the CPU. * @param which one of STATS_SINCE_CHARGED, STATS_SINCE_UNPLUGGED, or STATS_CURRENT. * @see BatteryStats#getCpuSpeedSteps() */ public abstract long getTimeAtCpuSpeed(int step, int which); public static abstract class Sensor { /* * FIXME: it's not correct to use this magic value because it Loading Loading @@ -506,15 +524,6 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long getForegroundTime(int which); /** * Returns the approximate cpu time (in milliseconds) spent at a certain CPU speed. * @param speedStep the index of the CPU speed. This is not the actual speed of the * CPU. * @param which one of STATS_SINCE_CHARGED, STATS_SINCE_UNPLUGGED, or STATS_CURRENT. * @see BatteryStats#getCpuSpeedSteps() */ public abstract long getTimeAtCpuSpeedStep(int speedStep, int which); public abstract int countExcessivePowers(); public abstract ExcessivePower getExcessivePower(int i); Loading Loading @@ -3873,6 +3882,16 @@ public abstract class BatteryStats implements Parcelable { } } final long userCpuTimeUs = u.getUserCpuTimeUs(which); final long systemCpuTimeUs = u.getSystemCpuTimeUs(which); if (userCpuTimeUs > 0 || systemCpuTimeUs > 0) { sb.setLength(0); sb.append(prefix); sb.append(" Total cpu time: "); formatTimeMs(sb, (userCpuTimeUs + systemCpuTimeUs) / 1000); pw.println(sb.toString()); } final ArrayMap<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); for (int ipr=processStats.size()-1; ipr>=0; ipr--) { Loading core/java/com/android/internal/os/BatteryStatsHelper.java +0 −1 Original line number Diff line number Diff line Loading @@ -742,7 +742,6 @@ public final class BatteryStatsHelper { parcel.setDataPosition(0); BatteryStatsImpl stats = com.android.internal.os.BatteryStatsImpl.CREATOR .createFromParcel(parcel); stats.distributeWorkLocked(BatteryStats.STATS_SINCE_CHARGED); return stats; } catch (IOException e) { Log.w(TAG, "Unable to read statistics stream", e); Loading core/java/com/android/internal/os/BatteryStatsImpl.java +134 −159 Original line number Diff line number Diff line Loading @@ -105,7 +105,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version private static final int VERSION = 125 + (USE_OLD_HISTORY ? 1000 : 0); private static final int VERSION = 126 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; Loading @@ -132,6 +132,9 @@ public final class BatteryStatsImpl extends BatteryStats { private final KernelWakelockReader mKernelWakelockReader = new KernelWakelockReader(); private final KernelWakelockStats mTmpWakelockStats = new KernelWakelockStats(); private final KernelUidCpuTimeReader mKernelUidCpuTimeReader = new KernelUidCpuTimeReader(); private final KernelCpuSpeedReader mKernelCpuSpeedReader = new KernelCpuSpeedReader(); public interface BatteryCallback { public void batteryNeedsCpuUpdate(); public void batteryPowerChanged(boolean onBattery); Loading Loading @@ -794,20 +797,6 @@ public final class BatteryStatsImpl extends BatteryStats { } } public static class SamplingCounter extends Counter { SamplingCounter(TimeBase timeBase, Parcel in) { super(timeBase, in); } SamplingCounter(TimeBase timeBase) { super(timeBase); } public void addCountAtomic(long count) { mCount.addAndGet((int)count); } } public static class LongSamplingCounter extends LongCounter implements TimeBaseObs { final TimeBase mTimeBase; long mCount; Loading Loading @@ -2918,8 +2907,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void finishAddingCpuLocked(int perc, int remainUTime, int remainSTtime, int totalUTime, int totalSTime, int statUserTime, int statSystemTime, int statIOWaitTime, int statIrqTime, int statSoftIrqTime, int statIdleTime, long[] cpuSpeedTimes) { int statIOWaitTime, int statIrqTime, int statSoftIrqTime, int statIdleTime) { if (DEBUG) Slog.d(TAG, "Adding cpu: tuser=" + totalUTime + " tsys=" + totalSTime + " user=" + statUserTime + " sys=" + statSystemTime + " io=" + statIOWaitTime + " irq=" + statIrqTime Loading Loading @@ -2959,7 +2947,7 @@ public final class BatteryStatsImpl extends BatteryStats { remainSTtime -= mySTime; num--; Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*"); proc.addCpuTimeLocked(myUTime, mySTime, cpuSpeedTimes); proc.addCpuTimeLocked(myUTime, mySTime); } } } Loading @@ -2970,7 +2958,7 @@ public final class BatteryStatsImpl extends BatteryStats { Uid uid = getUidStatsLocked(Process.SYSTEM_UID); if (uid != null) { Uid.Proc proc = uid.getProcessStatsLocked("*lost*"); proc.addCpuTimeLocked(remainUTime, remainSTtime, cpuSpeedTimes); proc.addCpuTimeLocked(remainUTime, remainSTtime); } } } Loading Loading @@ -4398,6 +4386,10 @@ public final class BatteryStatsImpl extends BatteryStats { long mCurStepUserTime; long mCurStepSystemTime; LongSamplingCounter mUserCpuTime = new LongSamplingCounter(mOnBatteryTimeBase); LongSamplingCounter mSystemCpuTime = new LongSamplingCounter(mOnBatteryTimeBase); LongSamplingCounter[] mSpeedBins; /** * The statistics we have collected for this uid's wake locks. */ Loading Loading @@ -4455,6 +4447,7 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, mWifiMulticastTimers, mOnBatteryTimeBase); mProcessStateTimer = new StopwatchTimer[NUM_PROCESS_STATE]; mSpeedBins = new LongSamplingCounter[getCpuSpeedSteps()]; } @Override Loading Loading @@ -4924,6 +4917,26 @@ public final class BatteryStatsImpl extends BatteryStats { ? (int)mMobileRadioActiveCount.getCountLocked(which) : 0; } @Override public long getUserCpuTimeUs(int which) { return mUserCpuTime.getCountLocked(which); } @Override public long getSystemCpuTimeUs(int which) { return mSystemCpuTime.getCountLocked(which); } @Override public long getTimeAtCpuSpeed(int step, int which) { if (step >= 0 && step < mSpeedBins.length) { if (mSpeedBins[step] != null) { return mSpeedBins[step].getCountLocked(which); } } return 0; } @Override public long getWifiControllerActivity(int type, int which) { if (type >= 0 && type < NUM_CONTROLLER_ACTIVITY_TYPES && Loading Loading @@ -5026,6 +5039,15 @@ public final class BatteryStatsImpl extends BatteryStats { } } mUserCpuTime.reset(false); mSystemCpuTime.reset(false); for (int i = 0; i < mSpeedBins.length; i++) { LongSamplingCounter c = mSpeedBins[i]; if (c != null) { c.reset(false); } } final ArrayMap<String, Wakelock> wakeStats = mWakelockStats.getMap(); for (int iw=wakeStats.size()-1; iw>=0; iw--) { Wakelock wl = wakeStats.valueAt(iw); Loading Loading @@ -5159,6 +5181,15 @@ public final class BatteryStatsImpl extends BatteryStats { } } mPids.clear(); mUserCpuTime.detach(); mSystemCpuTime.detach(); for (int i = 0; i < mSpeedBins.length; i++) { LongSamplingCounter c = mSpeedBins[i]; if (c != null) { c.detach(); } } } return !active; Loading Loading @@ -5317,6 +5348,20 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(0); } } mUserCpuTime.writeToParcel(out); mSystemCpuTime.writeToParcel(out); out.writeInt(mSpeedBins.length); for (int i = 0; i < mSpeedBins.length; i++) { LongSamplingCounter c = mSpeedBins[i]; if (c != null) { out.writeInt(1); c.writeToParcel(out); } else { out.writeInt(0); } } } void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) { Loading Loading @@ -5482,6 +5527,18 @@ public final class BatteryStatsImpl extends BatteryStats { mBluetoothControllerTime[i] = null; } } mUserCpuTime = new LongSamplingCounter(mOnBatteryTimeBase, in); mSystemCpuTime = new LongSamplingCounter(mOnBatteryTimeBase, in); int bins = in.readInt(); int steps = getCpuSpeedSteps(); mSpeedBins = new LongSamplingCounter[bins >= steps ? bins : steps]; for (int i = 0; i < bins; i++) { if (in.readInt() != 0) { mSpeedBins[i] = new LongSamplingCounter(mOnBatteryTimeBase, in); } } } /** Loading Loading @@ -5762,14 +5819,11 @@ public final class BatteryStatsImpl extends BatteryStats { */ int mProcessState = PROCESS_STATE_NONE; SamplingCounter[] mSpeedBins; ArrayList<ExcessivePower> mExcessivePower; Proc(String name) { mName = name; mOnBatteryTimeBase.add(this); mSpeedBins = new SamplingCounter[getCpuSpeedSteps()]; } public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { Loading @@ -5791,25 +5845,12 @@ public final class BatteryStatsImpl extends BatteryStats { mLoadedStarts = mLoadedNumCrashes = mLoadedNumAnrs = 0; mUnpluggedUserTime = mUnpluggedSystemTime = mUnpluggedForegroundTime = 0; mUnpluggedStarts = mUnpluggedNumCrashes = mUnpluggedNumAnrs = 0; for (int i = 0; i < mSpeedBins.length; i++) { SamplingCounter c = mSpeedBins[i]; if (c != null) { c.reset(false); } } mExcessivePower = null; } void detach() { mActive = false; mOnBatteryTimeBase.remove(this); for (int i = 0; i < mSpeedBins.length; i++) { SamplingCounter c = mSpeedBins[i]; if (c != null) { mOnBatteryTimeBase.remove(c); mSpeedBins[i] = null; } } } public int countExcessivePowers() { Loading Loading @@ -5903,18 +5944,6 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(mUnpluggedStarts); out.writeInt(mUnpluggedNumCrashes); out.writeInt(mUnpluggedNumAnrs); out.writeInt(mSpeedBins.length); for (int i = 0; i < mSpeedBins.length; i++) { SamplingCounter c = mSpeedBins[i]; if (c != null) { out.writeInt(1); c.writeToParcel(out); } else { out.writeInt(0); } } writeExcessivePowerToParcelLocked(out); } Loading @@ -5937,39 +5966,12 @@ public final class BatteryStatsImpl extends BatteryStats { mUnpluggedStarts = in.readInt(); mUnpluggedNumCrashes = in.readInt(); mUnpluggedNumAnrs = in.readInt(); int bins = in.readInt(); int steps = getCpuSpeedSteps(); mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps]; for (int i = 0; i < bins; i++) { if (in.readInt() != 0) { mSpeedBins[i] = new SamplingCounter(mOnBatteryTimeBase, in); } } readExcessivePowerFromParcelLocked(in); } public BatteryStatsImpl getBatteryStats() { return BatteryStatsImpl.this; } public void addCpuTimeLocked(int utime, int stime, long[] speedStepBins) { public void addCpuTimeLocked(int utime, int stime) { mUserTime += utime; mCurStepUserTime += utime; mSystemTime += stime; mCurStepSystemTime += stime; for (int i = 0; i < mSpeedBins.length && i < speedStepBins.length; i++) { long amt = speedStepBins[i]; if (amt != 0) { SamplingCounter c = mSpeedBins[i]; if (c == null) { mSpeedBins[i] = c = new SamplingCounter(mOnBatteryTimeBase); } c.addCountAtomic(speedStepBins[i]); } } } public void addForegroundTimeLocked(long ttime) { Loading Loading @@ -6058,16 +6060,6 @@ public final class BatteryStatsImpl extends BatteryStats { } return val; } @Override public long getTimeAtCpuSpeedStep(int speedStep, int which) { if (speedStep < mSpeedBins.length) { SamplingCounter c = mSpeedBins[speedStep]; return c != null ? c.getCountLocked(which) : 0; } else { return 0; } } } /** Loading Loading @@ -7785,6 +7777,32 @@ public final class BatteryStatsImpl extends BatteryStats { } } /** * Read and distribute CPU usage across apps. */ public void updateCpuTimeLocked(boolean firstTime) { final int cpuSpeedSteps = getCpuSpeedSteps(); final long[] cpuSpeeds = mKernelCpuSpeedReader.readDelta(); KernelUidCpuTimeReader.Callback callback = null; if (mOnBatteryInternal && !firstTime) { callback = new KernelUidCpuTimeReader.Callback() { @Override public void onUidCpuTime(int uid, long userTimeUs, long systemTimeUs) { final Uid u = getUidStatsLocked(mapUid(uid)); u.mUserCpuTime.addCountLocked(userTimeUs); u.mSystemCpuTime.addCountLocked(systemTimeUs); for (int i = 0; i < cpuSpeedSteps; i++) { if (u.mSpeedBins[i] == null) { u.mSpeedBins[i] = new LongSamplingCounter(mOnBatteryTimeBase); } u.mSpeedBins[i].addCountLocked(cpuSpeeds[i]); } } }; } mKernelUidCpuTimeReader.readDelta(callback); } boolean setChargingLocked(boolean charging) { if (mCharging != charging) { mCharging = charging; Loading Loading @@ -8440,58 +8458,6 @@ public final class BatteryStatsImpl extends BatteryStats { return u.getServiceStatsLocked(pkg, name); } /** * Massage data to distribute any reasonable work down to more specific * owners. Must only be called on a dead BatteryStats object! */ public void distributeWorkLocked(int which) { // Aggregate all CPU time associated with WIFI. Uid wifiUid = mUidStats.get(Process.WIFI_UID); if (wifiUid != null) { long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which); for (int ip=wifiUid.mProcessStats.size()-1; ip>=0; ip--) { Uid.Proc proc = wifiUid.mProcessStats.valueAt(ip); long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which); for (int i=0; i<mUidStats.size(); i++) { Uid uid = mUidStats.valueAt(i); if (uid.mUid != Process.WIFI_UID) { long uidRunningTime = uid.getWifiRunningTime(uSecTime, which); if (uidRunningTime > 0) { Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*"); long time = proc.getUserTime(which); time = (time*uidRunningTime)/totalRunningTime; uidProc.mUserTime += time; proc.mUserTime -= time; time = proc.getSystemTime(which); time = (time*uidRunningTime)/totalRunningTime; uidProc.mSystemTime += time; proc.mSystemTime -= time; time = proc.getForegroundTime(which); time = (time*uidRunningTime)/totalRunningTime; uidProc.mForegroundTime += time; proc.mForegroundTime -= time; for (int sb=0; sb<proc.mSpeedBins.length; sb++) { SamplingCounter sc = proc.mSpeedBins[sb]; if (sc != null) { time = sc.getCountLocked(which); time = (time*uidRunningTime)/totalRunningTime; SamplingCounter uidSc = uidProc.mSpeedBins[sb]; if (uidSc == null) { uidSc = new SamplingCounter(mOnBatteryTimeBase); uidProc.mSpeedBins[sb] = uidSc; } uidSc.mCount.addAndGet((int)time); sc.mCount.addAndGet((int)-time); } } totalRunningTime -= uidRunningTime; } } } } } } public void shutdownLocked() { recordShutdownLocked(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); writeSyncLocked(); Loading Loading @@ -8950,6 +8916,23 @@ public final class BatteryStatsImpl extends BatteryStats { u.mMobileRadioActiveCount.readSummaryFromParcelLocked(in); } u.mUserCpuTime.readSummaryFromParcelLocked(in); u.mSystemCpuTime.readSummaryFromParcelLocked(in); int NSB = in.readInt(); if (NSB > 100) { Slog.w(TAG, "File corrupt: too many speed bins " + NSB); return; } u.mSpeedBins = new LongSamplingCounter[NSB]; for (int i=0; i<NSB; i++) { if (in.readInt() != 0) { u.mSpeedBins[i] = new LongSamplingCounter(mOnBatteryTimeBase); u.mSpeedBins[i].readSummaryFromParcelLocked(in); } } int NW = in.readInt(); if (NW > 100) { Slog.w(TAG, "File corrupt: too many wake locks " + NW); Loading Loading @@ -9007,18 +8990,6 @@ public final class BatteryStatsImpl extends BatteryStats { p.mStarts = p.mLoadedStarts = in.readInt(); p.mNumCrashes = p.mLoadedNumCrashes = in.readInt(); p.mNumAnrs = p.mLoadedNumAnrs = in.readInt(); int NSB = in.readInt(); if (NSB > 100) { Slog.w(TAG, "File corrupt: too many speed bins " + NSB); return; } p.mSpeedBins = new SamplingCounter[NSB]; for (int i=0; i<NSB; i++) { if (in.readInt() != 0) { p.mSpeedBins[i] = new SamplingCounter(mOnBatteryTimeBase); p.mSpeedBins[i].readSummaryFromParcelLocked(in); } } if (!p.readExcessivePowerFromParcelLocked(in)) { return; } Loading Loading @@ -9278,6 +9249,20 @@ public final class BatteryStatsImpl extends BatteryStats { u.mMobileRadioActiveCount.writeSummaryFromParcelLocked(out); } u.mUserCpuTime.writeSummaryFromParcelLocked(out); u.mSystemCpuTime.writeSummaryFromParcelLocked(out); out.writeInt(u.mSpeedBins.length); for (int i = 0; i < u.mSpeedBins.length; i++) { LongSamplingCounter speedBin = u.mSpeedBins[i]; if (speedBin != null) { out.writeInt(1); speedBin.writeSummaryFromParcelLocked(out); } else { out.writeInt(0); } } final ArrayMap<String, Uid.Wakelock> wakeStats = u.mWakelockStats.getMap(); int NW = wakeStats.size(); out.writeInt(NW); Loading Loading @@ -9344,16 +9329,6 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(ps.mStarts); out.writeInt(ps.mNumCrashes); out.writeInt(ps.mNumAnrs); final int N = ps.mSpeedBins.length; out.writeInt(N); for (int i=0; i<N; i++) { if (ps.mSpeedBins[i] != null) { out.writeInt(1); ps.mSpeedBins[i].writeSummaryFromParcelLocked(out); } else { out.writeInt(0); } } ps.writeExcessivePowerToParcelLocked(out); } Loading Loading
core/java/android/os/BatteryStats.java +28 −9 Original line number Diff line number Diff line Loading @@ -425,6 +425,24 @@ public abstract class BatteryStats implements Parcelable { public abstract long getMobileRadioActiveTime(int which); public abstract int getMobileRadioActiveCount(int which); /** * Get the total cpu time (in microseconds) this UID had processes executing in userspace. */ public abstract long getUserCpuTimeUs(int which); /** * Get the total cpu time (in microseconds) this UID had processes executing kernel syscalls. */ public abstract long getSystemCpuTimeUs(int which); /** * Returns the approximate cpu time (in milliseconds) spent at a certain CPU speed. * @param speedStep the index of the CPU speed. This is not the actual speed of the CPU. * @param which one of STATS_SINCE_CHARGED, STATS_SINCE_UNPLUGGED, or STATS_CURRENT. * @see BatteryStats#getCpuSpeedSteps() */ public abstract long getTimeAtCpuSpeed(int step, int which); public static abstract class Sensor { /* * FIXME: it's not correct to use this magic value because it Loading Loading @@ -506,15 +524,6 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long getForegroundTime(int which); /** * Returns the approximate cpu time (in milliseconds) spent at a certain CPU speed. * @param speedStep the index of the CPU speed. This is not the actual speed of the * CPU. * @param which one of STATS_SINCE_CHARGED, STATS_SINCE_UNPLUGGED, or STATS_CURRENT. * @see BatteryStats#getCpuSpeedSteps() */ public abstract long getTimeAtCpuSpeedStep(int speedStep, int which); public abstract int countExcessivePowers(); public abstract ExcessivePower getExcessivePower(int i); Loading Loading @@ -3873,6 +3882,16 @@ public abstract class BatteryStats implements Parcelable { } } final long userCpuTimeUs = u.getUserCpuTimeUs(which); final long systemCpuTimeUs = u.getSystemCpuTimeUs(which); if (userCpuTimeUs > 0 || systemCpuTimeUs > 0) { sb.setLength(0); sb.append(prefix); sb.append(" Total cpu time: "); formatTimeMs(sb, (userCpuTimeUs + systemCpuTimeUs) / 1000); pw.println(sb.toString()); } final ArrayMap<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); for (int ipr=processStats.size()-1; ipr>=0; ipr--) { Loading
core/java/com/android/internal/os/BatteryStatsHelper.java +0 −1 Original line number Diff line number Diff line Loading @@ -742,7 +742,6 @@ public final class BatteryStatsHelper { parcel.setDataPosition(0); BatteryStatsImpl stats = com.android.internal.os.BatteryStatsImpl.CREATOR .createFromParcel(parcel); stats.distributeWorkLocked(BatteryStats.STATS_SINCE_CHARGED); return stats; } catch (IOException e) { Log.w(TAG, "Unable to read statistics stream", e); Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +134 −159 Original line number Diff line number Diff line Loading @@ -105,7 +105,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version private static final int VERSION = 125 + (USE_OLD_HISTORY ? 1000 : 0); private static final int VERSION = 126 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; Loading @@ -132,6 +132,9 @@ public final class BatteryStatsImpl extends BatteryStats { private final KernelWakelockReader mKernelWakelockReader = new KernelWakelockReader(); private final KernelWakelockStats mTmpWakelockStats = new KernelWakelockStats(); private final KernelUidCpuTimeReader mKernelUidCpuTimeReader = new KernelUidCpuTimeReader(); private final KernelCpuSpeedReader mKernelCpuSpeedReader = new KernelCpuSpeedReader(); public interface BatteryCallback { public void batteryNeedsCpuUpdate(); public void batteryPowerChanged(boolean onBattery); Loading Loading @@ -794,20 +797,6 @@ public final class BatteryStatsImpl extends BatteryStats { } } public static class SamplingCounter extends Counter { SamplingCounter(TimeBase timeBase, Parcel in) { super(timeBase, in); } SamplingCounter(TimeBase timeBase) { super(timeBase); } public void addCountAtomic(long count) { mCount.addAndGet((int)count); } } public static class LongSamplingCounter extends LongCounter implements TimeBaseObs { final TimeBase mTimeBase; long mCount; Loading Loading @@ -2918,8 +2907,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void finishAddingCpuLocked(int perc, int remainUTime, int remainSTtime, int totalUTime, int totalSTime, int statUserTime, int statSystemTime, int statIOWaitTime, int statIrqTime, int statSoftIrqTime, int statIdleTime, long[] cpuSpeedTimes) { int statIOWaitTime, int statIrqTime, int statSoftIrqTime, int statIdleTime) { if (DEBUG) Slog.d(TAG, "Adding cpu: tuser=" + totalUTime + " tsys=" + totalSTime + " user=" + statUserTime + " sys=" + statSystemTime + " io=" + statIOWaitTime + " irq=" + statIrqTime Loading Loading @@ -2959,7 +2947,7 @@ public final class BatteryStatsImpl extends BatteryStats { remainSTtime -= mySTime; num--; Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*"); proc.addCpuTimeLocked(myUTime, mySTime, cpuSpeedTimes); proc.addCpuTimeLocked(myUTime, mySTime); } } } Loading @@ -2970,7 +2958,7 @@ public final class BatteryStatsImpl extends BatteryStats { Uid uid = getUidStatsLocked(Process.SYSTEM_UID); if (uid != null) { Uid.Proc proc = uid.getProcessStatsLocked("*lost*"); proc.addCpuTimeLocked(remainUTime, remainSTtime, cpuSpeedTimes); proc.addCpuTimeLocked(remainUTime, remainSTtime); } } } Loading Loading @@ -4398,6 +4386,10 @@ public final class BatteryStatsImpl extends BatteryStats { long mCurStepUserTime; long mCurStepSystemTime; LongSamplingCounter mUserCpuTime = new LongSamplingCounter(mOnBatteryTimeBase); LongSamplingCounter mSystemCpuTime = new LongSamplingCounter(mOnBatteryTimeBase); LongSamplingCounter[] mSpeedBins; /** * The statistics we have collected for this uid's wake locks. */ Loading Loading @@ -4455,6 +4447,7 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, mWifiMulticastTimers, mOnBatteryTimeBase); mProcessStateTimer = new StopwatchTimer[NUM_PROCESS_STATE]; mSpeedBins = new LongSamplingCounter[getCpuSpeedSteps()]; } @Override Loading Loading @@ -4924,6 +4917,26 @@ public final class BatteryStatsImpl extends BatteryStats { ? (int)mMobileRadioActiveCount.getCountLocked(which) : 0; } @Override public long getUserCpuTimeUs(int which) { return mUserCpuTime.getCountLocked(which); } @Override public long getSystemCpuTimeUs(int which) { return mSystemCpuTime.getCountLocked(which); } @Override public long getTimeAtCpuSpeed(int step, int which) { if (step >= 0 && step < mSpeedBins.length) { if (mSpeedBins[step] != null) { return mSpeedBins[step].getCountLocked(which); } } return 0; } @Override public long getWifiControllerActivity(int type, int which) { if (type >= 0 && type < NUM_CONTROLLER_ACTIVITY_TYPES && Loading Loading @@ -5026,6 +5039,15 @@ public final class BatteryStatsImpl extends BatteryStats { } } mUserCpuTime.reset(false); mSystemCpuTime.reset(false); for (int i = 0; i < mSpeedBins.length; i++) { LongSamplingCounter c = mSpeedBins[i]; if (c != null) { c.reset(false); } } final ArrayMap<String, Wakelock> wakeStats = mWakelockStats.getMap(); for (int iw=wakeStats.size()-1; iw>=0; iw--) { Wakelock wl = wakeStats.valueAt(iw); Loading Loading @@ -5159,6 +5181,15 @@ public final class BatteryStatsImpl extends BatteryStats { } } mPids.clear(); mUserCpuTime.detach(); mSystemCpuTime.detach(); for (int i = 0; i < mSpeedBins.length; i++) { LongSamplingCounter c = mSpeedBins[i]; if (c != null) { c.detach(); } } } return !active; Loading Loading @@ -5317,6 +5348,20 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(0); } } mUserCpuTime.writeToParcel(out); mSystemCpuTime.writeToParcel(out); out.writeInt(mSpeedBins.length); for (int i = 0; i < mSpeedBins.length; i++) { LongSamplingCounter c = mSpeedBins[i]; if (c != null) { out.writeInt(1); c.writeToParcel(out); } else { out.writeInt(0); } } } void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) { Loading Loading @@ -5482,6 +5527,18 @@ public final class BatteryStatsImpl extends BatteryStats { mBluetoothControllerTime[i] = null; } } mUserCpuTime = new LongSamplingCounter(mOnBatteryTimeBase, in); mSystemCpuTime = new LongSamplingCounter(mOnBatteryTimeBase, in); int bins = in.readInt(); int steps = getCpuSpeedSteps(); mSpeedBins = new LongSamplingCounter[bins >= steps ? bins : steps]; for (int i = 0; i < bins; i++) { if (in.readInt() != 0) { mSpeedBins[i] = new LongSamplingCounter(mOnBatteryTimeBase, in); } } } /** Loading Loading @@ -5762,14 +5819,11 @@ public final class BatteryStatsImpl extends BatteryStats { */ int mProcessState = PROCESS_STATE_NONE; SamplingCounter[] mSpeedBins; ArrayList<ExcessivePower> mExcessivePower; Proc(String name) { mName = name; mOnBatteryTimeBase.add(this); mSpeedBins = new SamplingCounter[getCpuSpeedSteps()]; } public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { Loading @@ -5791,25 +5845,12 @@ public final class BatteryStatsImpl extends BatteryStats { mLoadedStarts = mLoadedNumCrashes = mLoadedNumAnrs = 0; mUnpluggedUserTime = mUnpluggedSystemTime = mUnpluggedForegroundTime = 0; mUnpluggedStarts = mUnpluggedNumCrashes = mUnpluggedNumAnrs = 0; for (int i = 0; i < mSpeedBins.length; i++) { SamplingCounter c = mSpeedBins[i]; if (c != null) { c.reset(false); } } mExcessivePower = null; } void detach() { mActive = false; mOnBatteryTimeBase.remove(this); for (int i = 0; i < mSpeedBins.length; i++) { SamplingCounter c = mSpeedBins[i]; if (c != null) { mOnBatteryTimeBase.remove(c); mSpeedBins[i] = null; } } } public int countExcessivePowers() { Loading Loading @@ -5903,18 +5944,6 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(mUnpluggedStarts); out.writeInt(mUnpluggedNumCrashes); out.writeInt(mUnpluggedNumAnrs); out.writeInt(mSpeedBins.length); for (int i = 0; i < mSpeedBins.length; i++) { SamplingCounter c = mSpeedBins[i]; if (c != null) { out.writeInt(1); c.writeToParcel(out); } else { out.writeInt(0); } } writeExcessivePowerToParcelLocked(out); } Loading @@ -5937,39 +5966,12 @@ public final class BatteryStatsImpl extends BatteryStats { mUnpluggedStarts = in.readInt(); mUnpluggedNumCrashes = in.readInt(); mUnpluggedNumAnrs = in.readInt(); int bins = in.readInt(); int steps = getCpuSpeedSteps(); mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps]; for (int i = 0; i < bins; i++) { if (in.readInt() != 0) { mSpeedBins[i] = new SamplingCounter(mOnBatteryTimeBase, in); } } readExcessivePowerFromParcelLocked(in); } public BatteryStatsImpl getBatteryStats() { return BatteryStatsImpl.this; } public void addCpuTimeLocked(int utime, int stime, long[] speedStepBins) { public void addCpuTimeLocked(int utime, int stime) { mUserTime += utime; mCurStepUserTime += utime; mSystemTime += stime; mCurStepSystemTime += stime; for (int i = 0; i < mSpeedBins.length && i < speedStepBins.length; i++) { long amt = speedStepBins[i]; if (amt != 0) { SamplingCounter c = mSpeedBins[i]; if (c == null) { mSpeedBins[i] = c = new SamplingCounter(mOnBatteryTimeBase); } c.addCountAtomic(speedStepBins[i]); } } } public void addForegroundTimeLocked(long ttime) { Loading Loading @@ -6058,16 +6060,6 @@ public final class BatteryStatsImpl extends BatteryStats { } return val; } @Override public long getTimeAtCpuSpeedStep(int speedStep, int which) { if (speedStep < mSpeedBins.length) { SamplingCounter c = mSpeedBins[speedStep]; return c != null ? c.getCountLocked(which) : 0; } else { return 0; } } } /** Loading Loading @@ -7785,6 +7777,32 @@ public final class BatteryStatsImpl extends BatteryStats { } } /** * Read and distribute CPU usage across apps. */ public void updateCpuTimeLocked(boolean firstTime) { final int cpuSpeedSteps = getCpuSpeedSteps(); final long[] cpuSpeeds = mKernelCpuSpeedReader.readDelta(); KernelUidCpuTimeReader.Callback callback = null; if (mOnBatteryInternal && !firstTime) { callback = new KernelUidCpuTimeReader.Callback() { @Override public void onUidCpuTime(int uid, long userTimeUs, long systemTimeUs) { final Uid u = getUidStatsLocked(mapUid(uid)); u.mUserCpuTime.addCountLocked(userTimeUs); u.mSystemCpuTime.addCountLocked(systemTimeUs); for (int i = 0; i < cpuSpeedSteps; i++) { if (u.mSpeedBins[i] == null) { u.mSpeedBins[i] = new LongSamplingCounter(mOnBatteryTimeBase); } u.mSpeedBins[i].addCountLocked(cpuSpeeds[i]); } } }; } mKernelUidCpuTimeReader.readDelta(callback); } boolean setChargingLocked(boolean charging) { if (mCharging != charging) { mCharging = charging; Loading Loading @@ -8440,58 +8458,6 @@ public final class BatteryStatsImpl extends BatteryStats { return u.getServiceStatsLocked(pkg, name); } /** * Massage data to distribute any reasonable work down to more specific * owners. Must only be called on a dead BatteryStats object! */ public void distributeWorkLocked(int which) { // Aggregate all CPU time associated with WIFI. Uid wifiUid = mUidStats.get(Process.WIFI_UID); if (wifiUid != null) { long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which); for (int ip=wifiUid.mProcessStats.size()-1; ip>=0; ip--) { Uid.Proc proc = wifiUid.mProcessStats.valueAt(ip); long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which); for (int i=0; i<mUidStats.size(); i++) { Uid uid = mUidStats.valueAt(i); if (uid.mUid != Process.WIFI_UID) { long uidRunningTime = uid.getWifiRunningTime(uSecTime, which); if (uidRunningTime > 0) { Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*"); long time = proc.getUserTime(which); time = (time*uidRunningTime)/totalRunningTime; uidProc.mUserTime += time; proc.mUserTime -= time; time = proc.getSystemTime(which); time = (time*uidRunningTime)/totalRunningTime; uidProc.mSystemTime += time; proc.mSystemTime -= time; time = proc.getForegroundTime(which); time = (time*uidRunningTime)/totalRunningTime; uidProc.mForegroundTime += time; proc.mForegroundTime -= time; for (int sb=0; sb<proc.mSpeedBins.length; sb++) { SamplingCounter sc = proc.mSpeedBins[sb]; if (sc != null) { time = sc.getCountLocked(which); time = (time*uidRunningTime)/totalRunningTime; SamplingCounter uidSc = uidProc.mSpeedBins[sb]; if (uidSc == null) { uidSc = new SamplingCounter(mOnBatteryTimeBase); uidProc.mSpeedBins[sb] = uidSc; } uidSc.mCount.addAndGet((int)time); sc.mCount.addAndGet((int)-time); } } totalRunningTime -= uidRunningTime; } } } } } } public void shutdownLocked() { recordShutdownLocked(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); writeSyncLocked(); Loading Loading @@ -8950,6 +8916,23 @@ public final class BatteryStatsImpl extends BatteryStats { u.mMobileRadioActiveCount.readSummaryFromParcelLocked(in); } u.mUserCpuTime.readSummaryFromParcelLocked(in); u.mSystemCpuTime.readSummaryFromParcelLocked(in); int NSB = in.readInt(); if (NSB > 100) { Slog.w(TAG, "File corrupt: too many speed bins " + NSB); return; } u.mSpeedBins = new LongSamplingCounter[NSB]; for (int i=0; i<NSB; i++) { if (in.readInt() != 0) { u.mSpeedBins[i] = new LongSamplingCounter(mOnBatteryTimeBase); u.mSpeedBins[i].readSummaryFromParcelLocked(in); } } int NW = in.readInt(); if (NW > 100) { Slog.w(TAG, "File corrupt: too many wake locks " + NW); Loading Loading @@ -9007,18 +8990,6 @@ public final class BatteryStatsImpl extends BatteryStats { p.mStarts = p.mLoadedStarts = in.readInt(); p.mNumCrashes = p.mLoadedNumCrashes = in.readInt(); p.mNumAnrs = p.mLoadedNumAnrs = in.readInt(); int NSB = in.readInt(); if (NSB > 100) { Slog.w(TAG, "File corrupt: too many speed bins " + NSB); return; } p.mSpeedBins = new SamplingCounter[NSB]; for (int i=0; i<NSB; i++) { if (in.readInt() != 0) { p.mSpeedBins[i] = new SamplingCounter(mOnBatteryTimeBase); p.mSpeedBins[i].readSummaryFromParcelLocked(in); } } if (!p.readExcessivePowerFromParcelLocked(in)) { return; } Loading Loading @@ -9278,6 +9249,20 @@ public final class BatteryStatsImpl extends BatteryStats { u.mMobileRadioActiveCount.writeSummaryFromParcelLocked(out); } u.mUserCpuTime.writeSummaryFromParcelLocked(out); u.mSystemCpuTime.writeSummaryFromParcelLocked(out); out.writeInt(u.mSpeedBins.length); for (int i = 0; i < u.mSpeedBins.length; i++) { LongSamplingCounter speedBin = u.mSpeedBins[i]; if (speedBin != null) { out.writeInt(1); speedBin.writeSummaryFromParcelLocked(out); } else { out.writeInt(0); } } final ArrayMap<String, Uid.Wakelock> wakeStats = u.mWakelockStats.getMap(); int NW = wakeStats.size(); out.writeInt(NW); Loading Loading @@ -9344,16 +9329,6 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(ps.mStarts); out.writeInt(ps.mNumCrashes); out.writeInt(ps.mNumAnrs); final int N = ps.mSpeedBins.length; out.writeInt(N); for (int i=0; i<N; i++) { if (ps.mSpeedBins[i] != null) { out.writeInt(1); ps.mSpeedBins[i].writeSummaryFromParcelLocked(out); } else { out.writeInt(0); } } ps.writeExcessivePowerToParcelLocked(out); } Loading