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

Commit 9425fe21 authored by Adam Lesinski's avatar Adam Lesinski
Browse files

BatteryStats: Record doze wake locks

Doze wake locks don't actually hold the CPU awake, so we should record them
separately from full wakelocks, which is what we did before.

Bug:21949905
Change-Id: Ib4db3399069e0ad11f1f0dc6925a87ad0ad21ff9
parent 8d79e36c
Loading
Loading
Loading
Loading
+24 −8
Original line number Diff line number Diff line
@@ -141,6 +141,11 @@ public abstract class BatteryStats implements Parcelable {
     */
    public static final int CAMERA_TURNED_ON = 17;

    /**
     * A constant indicating a doze wake lock timer.
     */
    public static final int WAKE_TYPE_DOZE = 18;

    /**
     * Include all of the data in the stats, including previously saved data.
     */
@@ -3834,6 +3839,7 @@ public abstract class BatteryStats implements Parcelable {
            final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks
                    = u.getWakelockStats();
            long totalFullWakelock = 0, totalPartialWakelock = 0, totalWindowWakelock = 0;
            long totalDozeWakelock = 0;
            int countWakelock = 0;
            for (int iw=wakelocks.size()-1; iw>=0; iw--) {
                final Uid.Wakelock wl = wakelocks.valueAt(iw);
@@ -3848,19 +3854,21 @@ public abstract class BatteryStats implements Parcelable {
                        "partial", which, linePrefix);
                linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), rawRealtime,
                        "window", which, linePrefix);
                if (true || !linePrefix.equals(": ")) {
                linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_DOZE), rawRealtime,
                        "doze", which, linePrefix);
                sb.append(" realtime");
                    // Only print out wake locks that were held
                pw.println(sb.toString());
                uidActivity = true;
                countWakelock++;
                }

                totalFullWakelock += computeWakeLock(wl.getWakeTime(WAKE_TYPE_FULL),
                        rawRealtime, which);
                totalPartialWakelock += computeWakeLock(wl.getWakeTime(WAKE_TYPE_PARTIAL),
                        rawRealtime, which);
                totalWindowWakelock += computeWakeLock(wl.getWakeTime(WAKE_TYPE_WINDOW),
                        rawRealtime, which);
                totalDozeWakelock += computeWakeLock(wl.getWakeTime(WAKE_TYPE_DOZE),
                        rawRealtime, which);
            }
            if (countWakelock > 1) {
                if (totalFullWakelock != 0 || totalPartialWakelock != 0
@@ -3890,6 +3898,14 @@ public abstract class BatteryStats implements Parcelable {
                        formatTimeMs(sb, totalWindowWakelock);
                        sb.append("window");
                    }
                    if (totalDozeWakelock != 0) {
                        if (needComma) {
                            sb.append(",");
                        }
                        needComma = true;
                        formatTimeMs(sb, totalDozeWakelock);
                        sb.append("doze");
                    }
                    sb.append(" realtime");
                    pw.println(sb.toString());
                }
+35 −5
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ public final class BatteryStatsImpl extends BatteryStats {
    private static final int MAGIC = 0xBA757475; // 'BATSTATS'

    // Current on-disk Parcel version
    private static final int VERSION = 128 + (USE_OLD_HISTORY ? 1000 : 0);
    private static final int VERSION = 129 + (USE_OLD_HISTORY ? 1000 : 0);

    // Maximum number of items we will record in the history.
    private static final int MAX_HISTORY_ITEMS = 2000;
@@ -208,6 +208,7 @@ public final class BatteryStatsImpl extends BatteryStats {
    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<>();
    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<>();
    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<>();
    final ArrayList<StopwatchTimer> mDozeTimers = new ArrayList<>();
    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers = new SparseArray<>();
    final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<>();
    final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<>();
@@ -5647,6 +5648,11 @@ public final class BatteryStatsImpl extends BatteryStats {
             */
            StopwatchTimer mTimerWindow;

            /**
             * How long (in ms) this uid has had a doze wake lock.
             */
            StopwatchTimer mTimerDoze;

            /**
             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
             * proper timer pool from the given BatteryStatsImpl object.
@@ -5674,6 +5680,9 @@ public final class BatteryStatsImpl extends BatteryStats {
                if (mTimerWindow != null) {
                    wlactive |= !mTimerWindow.reset(false);
                }
                if (mTimerDoze != null) {
                    wlactive |= !mTimerDoze.reset(false);
                }
                if (!wlactive) {
                    if (mTimerFull != null) {
                        mTimerFull.detach();
@@ -5687,6 +5696,10 @@ public final class BatteryStatsImpl extends BatteryStats {
                        mTimerWindow.detach();
                        mTimerWindow = null;
                    }
                    if (mTimerDoze != null) {
                        mTimerDoze.detach();
                        mTimerDoze = null;
                    }
                }
                return !wlactive;
            }
@@ -5694,16 +5707,16 @@ public final class BatteryStatsImpl extends BatteryStats {
            void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) {
                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
                        mPartialTimers, screenOffTimeBase, in);
                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
                        mFullTimers, timeBase, in);
                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
                        mWindowTimers, timeBase, in);
                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, mFullTimers, timeBase, in);
                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, mWindowTimers, timeBase, in);
                mTimerDoze = readTimerFromParcel(WAKE_TYPE_DOZE, mDozeTimers, timeBase, in);
            }

            void writeToParcelLocked(Parcel out, long elapsedRealtimeUs) {
                Timer.writeTimerToParcel(out, mTimerPartial, elapsedRealtimeUs);
                Timer.writeTimerToParcel(out, mTimerFull, elapsedRealtimeUs);
                Timer.writeTimerToParcel(out, mTimerWindow, elapsedRealtimeUs);
                Timer.writeTimerToParcel(out, mTimerDoze, elapsedRealtimeUs);
            }

            @Override
@@ -5712,6 +5725,7 @@ public final class BatteryStatsImpl extends BatteryStats {
                case WAKE_TYPE_FULL: return mTimerFull;
                case WAKE_TYPE_PARTIAL: return mTimerPartial;
                case WAKE_TYPE_WINDOW: return mTimerWindow;
                case WAKE_TYPE_DOZE: return mTimerDoze;
                default: throw new IllegalArgumentException("type = " + type);
                }
            }
@@ -5743,6 +5757,13 @@ public final class BatteryStatsImpl extends BatteryStats {
                            mTimerWindow = t;
                        }
                        return t;
                    case WAKE_TYPE_DOZE:
                        t = mTimerDoze;
                        if (t == null) {
                            t = new StopwatchTimer(Uid.this, WAKE_TYPE_DOZE,
                                    mDozeTimers, mOnBatteryTimeBase);
                            mTimerDoze = t;
                        }
                    default:
                        throw new IllegalArgumentException("type=" + type);
                }
@@ -6599,6 +6620,9 @@ public final class BatteryStatsImpl extends BatteryStats {
            if (in.readInt() != 0) {
                wl.getStopwatchTimer(WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
            }
            if (in.readInt() != 0) {
                wl.getStopwatchTimer(WAKE_TYPE_DOZE).readSummaryFromParcelLocked(in);
            }
        }

        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
@@ -9586,6 +9610,12 @@ public final class BatteryStatsImpl extends BatteryStats {
                } else {
                    out.writeInt(0);
                }
                if (wl.mTimerDoze != null) {
                    out.writeInt(1);
                    wl.mTimerDoze.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
                } else {
                    out.writeInt(0);
                }
            }

            final ArrayMap<String, StopwatchTimer> syncStats = u.mSyncStats.getMap();