14eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato/*
24eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Copyright (C) 2013 The Android Open Source Project
34eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato *
44eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
54eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * you may not use this file except in compliance with the License.
64eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * You may obtain a copy of the License at
74eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato *
84eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
94eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato *
104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Unless required by applicable law or agreed to in writing, software
114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * See the License for the specific language governing permissions and
144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * limitations under the License.
154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */
164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopackage com.android.internal.app.procstats;
184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.Parcel;
204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.SystemClock;
214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.UserHandle;
229680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport android.service.procstats.ProcessStatsProto;
234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.ArrayMap;
244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.DebugUtils;
254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.Log;
263accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackbornimport android.util.LongSparseArray;
274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.Slog;
284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.TimeUtils;
299680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport android.util.proto.ProtoOutputStream;
309680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport android.util.proto.ProtoUtils;
314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ProcessStats.PackageState;
334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ProcessStats.ProcessStateHolder;
344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ProcessStats.TotalMemoryUseCollection;
354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_SAMPLE_COUNT;
364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_MINIMUM;
374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_AVERAGE;
384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_MAXIMUM;
39e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MINIMUM;
40e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport static com.android.internal.app.procstats.ProcessStats.PSS_RSS_AVERAGE;
41e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MAXIMUM;
424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_USS_MINIMUM;
434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_USS_AVERAGE;
444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_USS_MAXIMUM;
454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_COUNT;
464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_NOTHING;
474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_PERSISTENT;
484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_TOP;
494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_FOREGROUND;
504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_BACKGROUND;
514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_BACKUP;
524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_HEAVY_WEIGHT;
534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE;
544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE_RESTARTING;
554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_RECEIVER;
564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_HOME;
574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_LAST_ACTIVITY;
584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_ACTIVITY;
594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_ACTIVITY_CLIENT;
604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_EMPTY;
614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_COUNT;
624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.PrintWriter;
644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Comparator;
659680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport java.util.HashMap;
669680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport java.util.Map;
674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopublic final class ProcessState {
694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private static final String TAG = "ProcessStats";
704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private static final boolean DEBUG = false;
714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private static final boolean DEBUG_PARCEL = false;
724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    // Map from process states to the states we track.
744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private static final int[] PROCESS_STATE_TO_STATE = new int[] {
754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT
764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT_UI
774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_TOP,                      // ActivityManager.PROCESS_STATE_TOP
784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
7910fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn        STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_IMPORTANT_BACKGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
8283b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn        STATE_IMPORTANT_BACKGROUND,     // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_BACKUP,                   // ActivityManager.PROCESS_STATE_BACKUP
844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_SERVICE,                  // ActivityManager.PROCESS_STATE_SERVICE
854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_RECEIVER,                 // ActivityManager.PROCESS_STATE_RECEIVER
86bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn        STATE_TOP,                      // ActivityManager.PROCESS_STATE_TOP_SLEEPING
87f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn        STATE_HEAVY_WEIGHT,             // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_HOME,                     // ActivityManager.PROCESS_STATE_HOME
894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_LAST_ACTIVITY,            // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_CACHED_ACTIVITY,          // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_CACHED_ACTIVITY_CLIENT,   // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
9268a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn        STATE_CACHED_ACTIVITY,          // ActivityManager.PROCESS_STATE_CACHED_RECENT
934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        STATE_CACHED_EMPTY,             // ActivityManager.PROCESS_STATE_CACHED_EMPTY
944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    };
954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public static final Comparator<ProcessState> COMPARATOR = new Comparator<ProcessState>() {
974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            @Override
984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            public int compare(ProcessState lhs, ProcessState rhs) {
994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) {
1004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    return -1;
1014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) {
1024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    return 1;
1034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                }
1044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                return 0;
1054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
1064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        };
1074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    static class PssAggr {
1094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        long pss = 0;
1104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        long samples = 0;
1114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        void add(long newPss, long newSamples) {
1134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pss = (long)( (pss*(double)samples) + (newPss*(double)newSamples) )
1144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    / (samples+newSamples);
1154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            samples += newSamples;
1164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
1174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
1184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    // Used by reset to count rather than storing extra maps. Be careful.
1204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public int tmpNumInUse;
1214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public ProcessState tmpFoundSubProc;
1224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private final ProcessStats mStats;
1244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private final String mName;
1254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private final String mPackage;
1264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private final int mUid;
1273accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn    private final long mVersion;
1284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private final DurationsTable mDurations;
1294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private final PssTable mPssTable;
1304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private ProcessState mCommonProcess;
1324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private int mCurState = STATE_NOTHING;
1334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private long mStartTime;
1344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private int mLastPssState = STATE_NOTHING;
1364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private long mLastPssTime;
1374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private boolean mActive;
1394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private int mNumActiveServices;
1404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private int mNumStartedServices;
1414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private int mNumExcessiveCpu;
1434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private int mNumCachedKill;
1454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private long mMinCachedKillPss;
1464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private long mAvgCachedKillPss;
1474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private long mMaxCachedKillPss;
1484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private boolean mMultiPackage;
1504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private boolean mDead;
1514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    // Set in computeProcessTimeLocked and used by COMPARATOR to sort. Be careful.
1534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private long mTmpTotalTime;
1544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    /**
1564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * Create a new top-level process state, for the initial case where there is only
1574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * a single package running in a process.  The initial state is not running.
1584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     */
1593accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn    public ProcessState(ProcessStats processStats, String pkg, int uid, long vers, String name) {
1604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mStats = processStats;
1614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mName = name;
1624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mCommonProcess = this;
1634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mPackage = pkg;
1644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mUid = uid;
1654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mVersion = vers;
1664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mDurations = new DurationsTable(processStats.mTableData);
1674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mPssTable = new PssTable(processStats.mTableData);
1684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
1694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    /**
1714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * Create a new per-package process state for an existing top-level process
1724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * state.  The current running state of the top-level process is also copied,
1734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * marked as started running at 'now'.
1744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     */
1753accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn    public ProcessState(ProcessState commonProcess, String pkg, int uid, long vers, String name,
1764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            long now) {
1774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mStats = commonProcess.mStats;
1784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mName = name;
1794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mCommonProcess = commonProcess;
1804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mPackage = pkg;
1814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mUid = uid;
1824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mVersion = vers;
1834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mCurState = commonProcess.mCurState;
1844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mStartTime = now;
1854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mDurations = new DurationsTable(commonProcess.mStats.mTableData);
1864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mPssTable = new PssTable(commonProcess.mStats.mTableData);
1874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
1884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
1894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public ProcessState clone(long now) {
1904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        ProcessState pnew = new ProcessState(this, mPackage, mUid, mVersion, mName, now);
1914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mDurations.addDurations(mDurations);
1924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mPssTable.copyFrom(mPssTable, PSS_COUNT);
1934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mNumExcessiveCpu = mNumExcessiveCpu;
1944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mNumCachedKill = mNumCachedKill;
1954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mMinCachedKillPss = mMinCachedKillPss;
1964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mAvgCachedKillPss = mAvgCachedKillPss;
1974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mMaxCachedKillPss = mMaxCachedKillPss;
1984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mActive = mActive;
1994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mNumActiveServices = mNumActiveServices;
2004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pnew.mNumStartedServices = mNumStartedServices;
2014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return pnew;
2024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public String getName() {
2054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mName;
2064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public ProcessState getCommonProcess() {
2094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mCommonProcess;
2104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    /**
2134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * Say that we are not part of a shared process, so mCommonProcess = this.
2144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     */
2154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void makeStandalone() {
2164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mCommonProcess = this;
2174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public String getPackage() {
2204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mPackage;
2214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public int getUid() {
2244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mUid;
2254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2273accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn    public long getVersion() {
2284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mVersion;
2294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public boolean isMultiPackage() {
2324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mMultiPackage;
2334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void setMultiPackage(boolean val) {
2364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mMultiPackage = val;
2374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public int getDurationsBucketCount() {
2404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mDurations.getKeyCount();
2414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void add(ProcessState other) {
2444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mDurations.addDurations(other.mDurations);
2454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mPssTable.mergeStats(other.mPssTable);
2464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mNumExcessiveCpu += other.mNumExcessiveCpu;
2474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (other.mNumCachedKill > 0) {
2484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss,
2494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    other.mAvgCachedKillPss, other.mMaxCachedKillPss);
2504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
2514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void resetSafely(long now) {
2544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mDurations.resetTable();
2554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mPssTable.resetTable();
2564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mStartTime = now;
2574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mLastPssState = STATE_NOTHING;
2584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mLastPssTime = 0;
2594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mNumExcessiveCpu = 0;
2604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mNumCachedKill = 0;
2614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
2624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void makeDead() {
2654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mDead = true;
2664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private void ensureNotDead() {
2694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (!mDead) {
2704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            return;
2714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
2721cc1d13d6efccbaec66b4237b80d6eae81f59108Joe Onorato        Slog.w(TAG, "ProcessState dead: name=" + mName
2734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName);
2744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void writeToParcel(Parcel out, long now) {
2774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        out.writeInt(mMultiPackage ? 1 : 0);
2784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mDurations.writeToParcel(out);
2794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mPssTable.writeToParcel(out);
280ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn        out.writeInt(0);  // was mNumExcessiveWake
2814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        out.writeInt(mNumExcessiveCpu);
2824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        out.writeInt(mNumCachedKill);
2834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mNumCachedKill > 0) {
2844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            out.writeLong(mMinCachedKillPss);
2854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            out.writeLong(mAvgCachedKillPss);
2864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            out.writeLong(mMaxCachedKillPss);
2874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
2884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
2894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
2904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public boolean readFromParcel(Parcel in, boolean fully) {
2914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        boolean multiPackage = in.readInt() != 0;
2924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (fully) {
2934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mMultiPackage = multiPackage;
2944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
2954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table...");
2964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (!mDurations.readFromParcel(in)) {
2974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            return false;
2984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
2994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table...");
3004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (!mPssTable.readFromParcel(in)) {
3014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            return false;
3024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
303ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn        in.readInt(); // was mNumExcessiveWake
3044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mNumExcessiveCpu = in.readInt();
3054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mNumCachedKill = in.readInt();
3064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mNumCachedKill > 0) {
3074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mMinCachedKillPss = in.readLong();
3084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mAvgCachedKillPss = in.readLong();
3094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mMaxCachedKillPss = in.readLong();
3104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        } else {
3114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
3124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
3134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return true;
3144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
3154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void makeActive() {
3174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        ensureNotDead();
3184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mActive = true;
3194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
3204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void makeInactive() {
3224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mActive = false;
3234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
3244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public boolean isInUse() {
3264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mActive || mNumActiveServices > 0 || mNumStartedServices > 0
3274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                || mCurState != STATE_NOTHING;
3284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
3294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public boolean isActive() {
3314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mActive;
3324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
3334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public boolean hasAnyData() {
3354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return !(mDurations.getKeyCount() == 0
3364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                && mCurState == STATE_NOTHING
3374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                && mPssTable.getKeyCount() == 0);
3384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
3394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    /**
3414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * Update the current state of the given list of processes.
3424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     *
3434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * @param state Current ActivityManager.PROCESS_STATE_*
3444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * @param memFactor Current mem factor constant.
3454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * @param now Current time.
3464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * @param pkgList Processes to update.
3474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     */
3484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void setState(int state, int memFactor, long now,
3494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            ArrayMap<String, ProcessStateHolder> pkgList) {
3504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (state < 0) {
3514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            state = mNumStartedServices > 0
3524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING;
3534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        } else {
3544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT);
3554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
3564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        // First update the common process.
3584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mCommonProcess.setState(state, now);
3594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        // If the common process is not multi-package, there is nothing else to do.
3614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (!mCommonProcess.mMultiPackage) {
3624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            return;
3634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
3644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (pkgList != null) {
3664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            for (int ip=pkgList.size()-1; ip>=0; ip--) {
3674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                pullFixedProc(pkgList, ip).setState(state, now);
3684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
3694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
3704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
3714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void setState(int state, long now) {
3734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        ensureNotDead();
3745c6740a30c2df5eb48a3cdca1ea355e5f113af2dpengzhicai        if (!mDead && (mCurState != state)) {
3754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state);
3764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            commitStateTime(now);
3774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mCurState = state;
3784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
3794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
3804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void commitStateTime(long now) {
3824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mCurState != STATE_NOTHING) {
3834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            long dur = now - mStartTime;
3844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (dur > 0) {
3854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                mDurations.addDuration(mCurState, dur);
3864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
3874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
3884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mStartTime = now;
3894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
3904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
3914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void incActiveServices(String serviceName) {
3924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (DEBUG && "".equals(mName)) {
3934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            RuntimeException here = new RuntimeException("here");
3944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            here.fillInStackTrace();
3954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName
3964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    + " to " + (mNumActiveServices+1), here);
3974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
3984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mCommonProcess != this) {
3994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mCommonProcess.incActiveServices(serviceName);
4004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mNumActiveServices++;
4024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
4034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
4044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void decActiveServices(String serviceName) {
4054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (DEBUG && "".equals(mName)) {
4064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            RuntimeException here = new RuntimeException("here");
4074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            here.fillInStackTrace();
4084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName
4094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    + " to " + (mNumActiveServices-1), here);
4104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mCommonProcess != this) {
4124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mCommonProcess.decActiveServices(serviceName);
4134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mNumActiveServices--;
4154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mNumActiveServices < 0) {
4164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage
4174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    + " uid=" + mUid + " proc=" + mName + " service=" + serviceName);
4184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mNumActiveServices = 0;
4194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
4214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
4224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void incStartedServices(int memFactor, long now, String serviceName) {
4234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (false) {
4244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            RuntimeException here = new RuntimeException("here");
4254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            here.fillInStackTrace();
4264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            Slog.d(TAG, "incStartedServices: " + this + " service=" + serviceName
4274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    + " to " + (mNumStartedServices+1), here);
4284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mCommonProcess != this) {
4304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mCommonProcess.incStartedServices(memFactor, now, serviceName);
4314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mNumStartedServices++;
4334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) {
4344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            setState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now);
4354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
4374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
4384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void decStartedServices(int memFactor, long now, String serviceName) {
4394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (false) {
4404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            RuntimeException here = new RuntimeException("here");
4414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            here.fillInStackTrace();
4424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName
4434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    + " to " + (mNumStartedServices-1), here);
4444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mCommonProcess != this) {
4464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mCommonProcess.decStartedServices(memFactor, now, serviceName);
4474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mNumStartedServices--;
4494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mNumStartedServices == 0 && (mCurState%STATE_COUNT) == STATE_SERVICE_RESTARTING) {
4504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            setState(STATE_NOTHING, now);
4514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        } else if (mNumStartedServices < 0) {
4524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            Slog.wtfStack(TAG, "Proc started services underrun: pkg="
4534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    + mPackage + " uid=" + mUid + " name=" + mName);
4544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mNumStartedServices = 0;
4554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
4574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
458e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public void addPss(long pss, long uss, long rss, boolean always, int type, long duration,
4594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            ArrayMap<String, ProcessStateHolder> pkgList) {
4604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        ensureNotDead();
461052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn        switch (type) {
462e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            case ProcessStats.ADD_PSS_INTERNAL_SINGLE:
463e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                mStats.mInternalSinglePssCount++;
464e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                mStats.mInternalSinglePssTime += duration;
465e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                break;
466e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            case ProcessStats.ADD_PSS_INTERNAL_ALL_MEM:
467e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                mStats.mInternalAllMemPssCount++;
468e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                mStats.mInternalAllMemPssTime += duration;
469e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                break;
470e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            case ProcessStats.ADD_PSS_INTERNAL_ALL_POLL:
471e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                mStats.mInternalAllPollPssCount++;
472e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                mStats.mInternalAllPollPssTime += duration;
473052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn                break;
474052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn            case ProcessStats.ADD_PSS_EXTERNAL:
475052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn                mStats.mExternalPssCount++;
476052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn                mStats.mExternalPssTime += duration;
477052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn                break;
478052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn            case ProcessStats.ADD_PSS_EXTERNAL_SLOW:
479052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn                mStats.mExternalSlowPssCount++;
480052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn                mStats.mExternalSlowPssTime += duration;
481052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn                break;
482052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn        }
4834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (!always) {
4844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (mLastPssState == mCurState && SystemClock.uptimeMillis()
4854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    < (mLastPssTime+(30*1000))) {
4864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                return;
4874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
4884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
4894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mLastPssState = mCurState;
4904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mLastPssTime = SystemClock.uptimeMillis();
4914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mCurState != STATE_NOTHING) {
4924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // First update the common process.
493e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            mCommonProcess.mPssTable.mergeStats(mCurState, 1, pss, pss, pss, uss, uss, uss,
494e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                    rss, rss, rss);
4954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
4964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // If the common process is not multi-package, there is nothing else to do.
4974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (!mCommonProcess.mMultiPackage) {
4984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                return;
4994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
5004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
5014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (pkgList != null) {
5024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                for (int ip=pkgList.size()-1; ip>=0; ip--) {
5034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pullFixedProc(pkgList, ip).mPssTable.mergeStats(mCurState, 1,
504e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                            pss, pss, pss, uss, uss, uss, rss, rss, rss);
5054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                }
5064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
5074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
5084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
5094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
5104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void reportExcessiveCpu(ArrayMap<String, ProcessStateHolder> pkgList) {
5114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        ensureNotDead();
5124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mCommonProcess.mNumExcessiveCpu++;
5134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (!mCommonProcess.mMultiPackage) {
5144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            return;
5154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
5164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
5174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int ip=pkgList.size()-1; ip>=0; ip--) {
5184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pullFixedProc(pkgList, ip).mNumExcessiveCpu++;
5194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
5204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
5214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
5224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private void addCachedKill(int num, long minPss, long avgPss, long maxPss) {
5234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mNumCachedKill <= 0) {
5244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mNumCachedKill = num;
5254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mMinCachedKillPss = minPss;
5264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mAvgCachedKillPss = avgPss;
5274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mMaxCachedKillPss = maxPss;
5284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        } else {
5294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (minPss < mMinCachedKillPss) {
5304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                mMinCachedKillPss = minPss;
5314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
5324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (maxPss > mMaxCachedKillPss) {
5334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                mMaxCachedKillPss = maxPss;
5344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
5354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mAvgCachedKillPss = (long)( ((mAvgCachedKillPss*(double)mNumCachedKill) + avgPss)
5364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    / (mNumCachedKill+num) );
5374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            mNumCachedKill += num;
5384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
5394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
5404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
5414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void reportCachedKill(ArrayMap<String, ProcessStateHolder> pkgList, long pss) {
5424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        ensureNotDead();
5434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mCommonProcess.addCachedKill(1, pss, pss, pss);
5444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (!mCommonProcess.mMultiPackage) {
5454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            return;
5464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
5474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
5484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int ip=pkgList.size()-1; ip>=0; ip--) {
5494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pullFixedProc(pkgList, ip).addCachedKill(1, pss, pss, pss);
5504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
5514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
5524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
5534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public ProcessState pullFixedProc(String pkgName) {
5544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mMultiPackage) {
5554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // The array map is still pointing to a common process state
5564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // that is now shared across packages.  Update it to point to
5574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // the new per-package state.
5583accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn            LongSparseArray<PackageState> vpkg = mStats.mPackages.get(pkgName, mUid);
5594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (vpkg == null) {
5604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                throw new IllegalStateException("Didn't find package " + pkgName
5614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        + " / " + mUid);
5624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
5634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            PackageState pkg = vpkg.get(mVersion);
5644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (pkg == null) {
5654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                throw new IllegalStateException("Didn't find package " + pkgName
5664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        + " / " + mUid + " vers " + mVersion);
5674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
5684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            ProcessState proc = pkg.mProcesses.get(mName);
5694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (proc == null) {
5704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                throw new IllegalStateException("Didn't create per-package process "
5714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        + mName + " in pkg " + pkgName + " / " + mUid + " vers " + mVersion);
5724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
5734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            return proc;
5744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
5754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return this;
5764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
5774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
5784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private ProcessState pullFixedProc(ArrayMap<String, ProcessStateHolder> pkgList,
5794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            int index) {
5804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        ProcessStateHolder holder = pkgList.valueAt(index);
5814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        ProcessState proc = holder.state;
5824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mDead && proc.mCommonProcess != proc) {
5834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // Somehow we are contining to use a process state that is dead, because
5844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // it was not being told it was active during the last commit.  We can recover
5854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // from this by generating a fresh new state, but this is bad because we
5864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // are losing whatever data we had in the old process state.
5874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            Log.wtf(TAG, "Pulling dead proc: name=" + mName + " pkg=" + mPackage
5884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    + " uid=" + mUid + " common.name=" + mCommonProcess.mName);
5894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            proc = mStats.getProcessStateLocked(proc.mPackage, proc.mUid, proc.mVersion,
5904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    proc.mName);
5914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
5924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (proc.mMultiPackage) {
5934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // The array map is still pointing to a common process state
5944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // that is now shared across packages.  Update it to point to
5954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            // the new per-package state.
5963accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn            LongSparseArray<PackageState> vpkg = mStats.mPackages.get(pkgList.keyAt(index),
5974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    proc.mUid);
5984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (vpkg == null) {
5994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                throw new IllegalStateException("No existing package "
6004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        + pkgList.keyAt(index) + "/" + proc.mUid
6014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        + " for multi-proc " + proc.mName);
6024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
6034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            PackageState pkg = vpkg.get(proc.mVersion);
6044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (pkg == null) {
6054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                throw new IllegalStateException("No existing package "
6064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        + pkgList.keyAt(index) + "/" + proc.mUid
6074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        + " for multi-proc " + proc.mName + " version " + proc.mVersion);
6084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
6094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            String savedName = proc.mName;
6104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            proc = pkg.mProcesses.get(proc.mName);
6114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (proc == null) {
6124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                throw new IllegalStateException("Didn't create per-package process "
6134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        + savedName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid);
6144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
6154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            holder.state = proc;
6164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
6174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return proc;
6184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
6194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
6204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public long getDuration(int state, long now) {
6214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        long time = mDurations.getValueForId((byte)state);
6224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mCurState == state) {
6234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            time += now - mStartTime;
6244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
6254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return time;
6264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
6274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
6284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public long getPssSampleCount(int state) {
6294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mPssTable.getValueForId((byte)state, PSS_SAMPLE_COUNT);
6304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
6314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
6324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public long getPssMinimum(int state) {
6334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mPssTable.getValueForId((byte)state, PSS_MINIMUM);
6344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
6354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
6364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public long getPssAverage(int state) {
6374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mPssTable.getValueForId((byte)state, PSS_AVERAGE);
6384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
6394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
6404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public long getPssMaximum(int state) {
6414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mPssTable.getValueForId((byte)state, PSS_MAXIMUM);
6424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
6434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
6444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public long getPssUssMinimum(int state) {
6454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mPssTable.getValueForId((byte)state, PSS_USS_MINIMUM);
6464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
6474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
6484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public long getPssUssAverage(int state) {
6494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mPssTable.getValueForId((byte)state, PSS_USS_AVERAGE);
6504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
6514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
6524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public long getPssUssMaximum(int state) {
6534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return mPssTable.getValueForId((byte)state, PSS_USS_MAXIMUM);
6544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
6554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
656e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public long getPssRssMinimum(int state) {
657e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        return mPssTable.getValueForId((byte)state, PSS_RSS_MINIMUM);
658e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    }
659e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
660e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public long getPssRssAverage(int state) {
661e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        return mPssTable.getValueForId((byte)state, PSS_RSS_AVERAGE);
662e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    }
663e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
664e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public long getPssRssMaximum(int state) {
665e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        return mPssTable.getValueForId((byte)state, PSS_RSS_MAXIMUM);
666e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    }
667e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
6684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    /**
6694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * Sums up the PSS data and adds it to 'data'.
6704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     *
6714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * @param data The aggregate data is added here.
6724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     * @param now SystemClock.uptimeMillis()
6734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     */
6744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void aggregatePss(TotalMemoryUseCollection data, long now) {
6754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        final PssAggr fgPss = new PssAggr();
6764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        final PssAggr bgPss = new PssAggr();
6774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        final PssAggr cachedPss = new PssAggr();
6784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        boolean havePss = false;
6794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int i=0; i<mDurations.getKeyCount(); i++) {
6804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            final int key = mDurations.getKeyAt(i);
6814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            int type = SparseMappingTable.getIdFromKey(key);
6824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            int procState = type % STATE_COUNT;
6834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            long samples = getPssSampleCount(type);
6844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (samples > 0) {
6854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                long avg = getPssAverage(type);
6864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                havePss = true;
6874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                if (procState <= STATE_IMPORTANT_FOREGROUND) {
6884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    fgPss.add(avg, samples);
6894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                } else if (procState <= STATE_RECEIVER) {
6904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    bgPss.add(avg, samples);
6914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                } else {
6924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    cachedPss.add(avg, samples);
6934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                }
6944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
6954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
6964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (!havePss) {
6974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            return;
6984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
6994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        boolean fgHasBg = false;
7004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        boolean fgHasCached = false;
7014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        boolean bgHasCached = false;
7024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (fgPss.samples < 3 && bgPss.samples > 0) {
7034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            fgHasBg = true;
7044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            fgPss.add(bgPss.pss, bgPss.samples);
7054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
7064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (fgPss.samples < 3 && cachedPss.samples > 0) {
7074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            fgHasCached = true;
7084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            fgPss.add(cachedPss.pss, cachedPss.samples);
7094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
7104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (bgPss.samples < 3 && cachedPss.samples > 0) {
7114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            bgHasCached = true;
7124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            bgPss.add(cachedPss.pss, cachedPss.samples);
7134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
7144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (bgPss.samples < 3 && !fgHasBg && fgPss.samples > 0) {
7154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            bgPss.add(fgPss.pss, fgPss.samples);
7164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
7174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (cachedPss.samples < 3 && !bgHasCached && bgPss.samples > 0) {
7184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            cachedPss.add(bgPss.pss, bgPss.samples);
7194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
7204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (cachedPss.samples < 3 && !fgHasCached && fgPss.samples > 0) {
7214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            cachedPss.add(fgPss.pss, fgPss.samples);
7224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
7234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int i=0; i<mDurations.getKeyCount(); i++) {
7244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            final int key = mDurations.getKeyAt(i);
7254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            final int type = SparseMappingTable.getIdFromKey(key);
7264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            long time = mDurations.getValue(key);
7274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (mCurState == type) {
7284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                time += now - mStartTime;
7294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
7304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            final int procState = type % STATE_COUNT;
7314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            data.processStateTime[procState] += time;
7324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            long samples = getPssSampleCount(type);
7334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            long avg;
7344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (samples > 0) {
7354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                avg = getPssAverage(type);
7364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            } else if (procState <= STATE_IMPORTANT_FOREGROUND) {
7374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                samples = fgPss.samples;
7384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                avg = fgPss.pss;
7394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            } else if (procState <= STATE_RECEIVER) {
7404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                samples = bgPss.samples;
7414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                avg = bgPss.pss;
7424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            } else {
7434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                samples = cachedPss.samples;
7444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                avg = cachedPss.pss;
7454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
7464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            double newAvg = ( (data.processStatePss[procState]
7474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    * (double)data.processStateSamples[procState])
7484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        + (avg*(double)samples)
7494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    ) / (data.processStateSamples[procState]+samples);
7504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            data.processStatePss[procState] = (long)newAvg;
7514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            data.processStateSamples[procState] += samples;
7524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            data.processStateWeight[procState] += avg * (double)time;
7534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
7544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
7554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
7564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public long computeProcessTimeLocked(int[] screenStates, int[] memStates,
7574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                int[] procStates, long now) {
7584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        long totalTime = 0;
7594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int is=0; is<screenStates.length; is++) {
7604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            for (int im=0; im<memStates.length; im++) {
7614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                for (int ip=0; ip<procStates.length; ip++) {
7624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT)
7634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            + procStates[ip];
7644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    totalTime += getDuration(bucket, now);
7654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                }
7664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
7674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
7684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        mTmpTotalTime = totalTime;
7694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return totalTime;
7704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
7714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
7724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void dumpSummary(PrintWriter pw, String prefix,
7734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            int[] screenStates, int[] memStates, int[] procStates,
7744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            long now, long totalTime) {
7754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(prefix);
7764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print("* ");
7774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(mName);
7784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(" / ");
7794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        UserHandle.formatUid(pw, mUid);
7804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(" / v");
7814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(mVersion);
7824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.println(":");
7834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "         TOTAL: ", screenStates, memStates,
7844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                procStates, now, totalTime, true);
7854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "    Persistent: ", screenStates, memStates,
7864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] { STATE_PERSISTENT }, now, totalTime, true);
7874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "           Top: ", screenStates, memStates,
7884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_TOP}, now, totalTime, true);
7894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "        Imp Fg: ", screenStates, memStates,
7904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true);
7914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "        Imp Bg: ", screenStates, memStates,
7924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true);
7934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "        Backup: ", screenStates, memStates,
7944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_BACKUP}, now, totalTime, true);
7954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "     Heavy Wgt: ", screenStates, memStates,
7964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true);
7974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "       Service: ", screenStates, memStates,
7984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_SERVICE}, now, totalTime, true);
7994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "    Service Rs: ", screenStates, memStates,
8004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true);
8014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "      Receiver: ", screenStates, memStates,
8024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_RECEIVER}, now, totalTime, true);
803e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        dumpProcessSummaryDetails(pw, prefix, "         Heavy: ", screenStates, memStates,
804e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                new int[] {STATE_HOME}, now, totalTime, true);
8054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "        (Home): ", screenStates, memStates,
8064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_HOME}, now, totalTime, true);
8074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "    (Last Act): ", screenStates, memStates,
8084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true);
8094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpProcessSummaryDetails(pw, prefix, "      (Cached): ", screenStates, memStates,
8104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT,
8114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        STATE_CACHED_EMPTY}, now, totalTime, true);
8124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
8134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
8144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void dumpProcessState(PrintWriter pw, String prefix,
8154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            int[] screenStates, int[] memStates, int[] procStates, long now) {
8164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        long totalTime = 0;
8174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        int printedScreen = -1;
8184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int is=0; is<screenStates.length; is++) {
8194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            int printedMem = -1;
8204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            for (int im=0; im<memStates.length; im++) {
8214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                for (int ip=0; ip<procStates.length; ip++) {
8224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int iscreen = screenStates[is];
8234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int imem = memStates[im];
8244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
8254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    long time = mDurations.getValueForId((byte)bucket);
8264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    String running = "";
8274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    if (mCurState == bucket) {
8284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        running = " (running)";
8294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    }
8304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    if (time != 0) {
8314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(prefix);
8324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        if (screenStates.length > 1) {
8334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            DumpUtils.printScreenLabel(pw, printedScreen != iscreen
8344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                    ? iscreen : STATE_NOTHING);
8354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            printedScreen = iscreen;
8364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        }
8374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        if (memStates.length > 1) {
8384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            DumpUtils.printMemLabel(pw,
8394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                    printedMem != imem ? imem : STATE_NOTHING, '/');
8404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            printedMem = imem;
8414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        }
8424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(DumpUtils.STATE_NAMES[procStates[ip]]); pw.print(": ");
8434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        TimeUtils.formatDuration(time, pw); pw.println(running);
8444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        totalTime += time;
8454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    }
8464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                }
8474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
8484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
8494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (totalTime != 0) {
8504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(prefix);
8514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (screenStates.length > 1) {
8524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                DumpUtils.printScreenLabel(pw, STATE_NOTHING);
8534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
8544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (memStates.length > 1) {
8554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                DumpUtils.printMemLabel(pw, STATE_NOTHING, '/');
8564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
8574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print("TOTAL  : ");
8584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            TimeUtils.formatDuration(totalTime, pw);
8594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.println();
8604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
8614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
8624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
8634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void dumpPss(PrintWriter pw, String prefix,
8644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            int[] screenStates, int[] memStates, int[] procStates) {
8654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        boolean printedHeader = false;
8664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        int printedScreen = -1;
8674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int is=0; is<screenStates.length; is++) {
8684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            int printedMem = -1;
8694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            for (int im=0; im<memStates.length; im++) {
8704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                for (int ip=0; ip<procStates.length; ip++) {
8714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int iscreen = screenStates[is];
8724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int imem = memStates[im];
8734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
8744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    long count = getPssSampleCount(bucket);
8754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    if (count > 0) {
8764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        if (!printedHeader) {
8774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            pw.print(prefix);
8784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            pw.print("PSS/USS (");
8794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            pw.print(mPssTable.getKeyCount());
8804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            pw.println(" entries):");
8814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            printedHeader = true;
8824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        }
8834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(prefix);
8844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print("  ");
8854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        if (screenStates.length > 1) {
8864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            DumpUtils.printScreenLabel(pw,
8874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                    printedScreen != iscreen ? iscreen : STATE_NOTHING);
8884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            printedScreen = iscreen;
8894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        }
8904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        if (memStates.length > 1) {
8914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            DumpUtils.printMemLabel(pw,
8924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                    printedMem != imem ? imem : STATE_NOTHING, '/');
8934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            printedMem = imem;
8944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        }
8954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(DumpUtils.STATE_NAMES[procStates[ip]]); pw.print(": ");
8964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(count);
8974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(" samples ");
8984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        DebugUtils.printSizeValue(pw, getPssMinimum(bucket) * 1024);
8994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(" ");
9004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        DebugUtils.printSizeValue(pw, getPssAverage(bucket) * 1024);
9014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(" ");
9024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        DebugUtils.printSizeValue(pw, getPssMaximum(bucket) * 1024);
9034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(" / ");
9044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        DebugUtils.printSizeValue(pw, getPssUssMinimum(bucket) * 1024);
9054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(" ");
9064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        DebugUtils.printSizeValue(pw, getPssUssAverage(bucket) * 1024);
9074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(" ");
9084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        DebugUtils.printSizeValue(pw, getPssUssMaximum(bucket) * 1024);
909e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                        pw.print(" / ");
910e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                        DebugUtils.printSizeValue(pw, getPssRssMinimum(bucket) * 1024);
911e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                        pw.print(" ");
912e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                        DebugUtils.printSizeValue(pw, getPssRssAverage(bucket) * 1024);
913e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                        pw.print(" ");
914e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                        DebugUtils.printSizeValue(pw, getPssRssMaximum(bucket) * 1024);
9154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.println();
9164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    }
9174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                }
9184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
9194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
9204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mNumExcessiveCpu != 0) {
9214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(prefix); pw.print("Killed for excessive CPU use: ");
9224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.print(mNumExcessiveCpu); pw.println(" times");
9234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
9244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mNumCachedKill != 0) {
9254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(prefix); pw.print("Killed from cached state: ");
9264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.print(mNumCachedKill); pw.print(" times from pss ");
9274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    DebugUtils.printSizeValue(pw, mMinCachedKillPss * 1024); pw.print("-");
9284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    DebugUtils.printSizeValue(pw, mAvgCachedKillPss * 1024); pw.print("-");
9294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    DebugUtils.printSizeValue(pw, mMaxCachedKillPss * 1024); pw.println();
9304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
9314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
9324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
9334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    private void dumpProcessSummaryDetails(PrintWriter pw, String prefix,
9344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            String label, int[] screenStates, int[] memStates, int[] procStates,
9354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            long now, long totalTime, boolean full) {
9364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        ProcessStats.ProcessDataCollection totals = new ProcessStats.ProcessDataCollection(
9374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                screenStates, memStates, procStates);
9384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        computeProcessData(totals, now);
9394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        final double percentage = (double) totals.totalTime / (double) totalTime * 100;
9404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        // We don't print percentages < .01, so just drop those.
9414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (percentage >= 0.005 || totals.numPss != 0) {
9424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (prefix != null) {
9434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                pw.print(prefix);
9444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
9454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (label != null) {
9464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                pw.print(label);
9474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
9484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            totals.print(pw, totalTime, full);
9494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (prefix != null) {
9504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                pw.println();
9514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
9524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
9534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
9544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
9554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void dumpInternalLocked(PrintWriter pw, String prefix, boolean dumpAll) {
9564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (dumpAll) {
9574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(prefix); pw.print("myID=");
9584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.print(Integer.toHexString(System.identityHashCode(this)));
9594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.print(" mCommonProcess=");
9604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.print(Integer.toHexString(System.identityHashCode(mCommonProcess)));
9614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.print(" mPackage="); pw.println(mPackage);
9624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (mMultiPackage) {
9634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                pw.print(prefix); pw.print("mMultiPackage="); pw.println(mMultiPackage);
9644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
9654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (this != mCommonProcess) {
9664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                pw.print(prefix); pw.print("Common Proc: "); pw.print(mCommonProcess.mName);
9674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print("/"); pw.print(mCommonProcess.mUid);
9684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        pw.print(" pkg="); pw.println(mCommonProcess.mPackage);
9694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
9704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
9714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mActive) {
9724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(prefix); pw.print("mActive="); pw.println(mActive);
9734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
9744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mDead) {
9754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(prefix); pw.print("mDead="); pw.println(mDead);
9764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
9774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mNumActiveServices != 0 || mNumStartedServices != 0) {
9784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(prefix); pw.print("mNumActiveServices="); pw.print(mNumActiveServices);
9794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.print(" mNumStartedServices=");
9804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.println(mNumStartedServices);
9814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
9824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
9834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
9844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void computeProcessData(ProcessStats.ProcessDataCollection data, long now) {
9854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        data.totalTime = 0;
9864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        data.numPss = data.minPss = data.avgPss = data.maxPss =
987e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                data.minUss = data.avgUss = data.maxUss =
988e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                data.minRss = data.avgRss = data.maxRss = 0;
9894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int is=0; is<data.screenStates.length; is++) {
9904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            for (int im=0; im<data.memStates.length; im++) {
9914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                for (int ip=0; ip<data.procStates.length; ip++) {
9924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT)
9934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            + data.procStates[ip];
9944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    data.totalTime += getDuration(bucket, now);
9954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    long samples = getPssSampleCount(bucket);
9964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    if (samples > 0) {
9974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        long minPss = getPssMinimum(bucket);
9984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        long avgPss = getPssAverage(bucket);
9994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        long maxPss = getPssMaximum(bucket);
10004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        long minUss = getPssUssMinimum(bucket);
10014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        long avgUss = getPssUssAverage(bucket);
10024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        long maxUss = getPssUssMaximum(bucket);
1003e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                        long minRss = getPssRssMinimum(bucket);
1004e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                        long avgRss = getPssRssAverage(bucket);
1005e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                        long maxRss = getPssRssMaximum(bucket);
10064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        if (data.numPss == 0) {
10074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            data.minPss = minPss;
10084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            data.avgPss = avgPss;
10094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            data.maxPss = maxPss;
10104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            data.minUss = minUss;
10114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            data.avgUss = avgUss;
10124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            data.maxUss = maxUss;
1013e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                            data.minRss = minRss;
1014e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                            data.avgRss = avgRss;
1015e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                            data.maxRss = maxRss;
10164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        } else {
10174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            if (minPss < data.minPss) {
10184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                data.minPss = minPss;
10194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            }
10204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            data.avgPss = (long)( ((data.avgPss*(double)data.numPss)
10214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                    + (avgPss*(double)samples)) / (data.numPss+samples) );
10224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            if (maxPss > data.maxPss) {
10234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                data.maxPss = maxPss;
10244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            }
10254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            if (minUss < data.minUss) {
10264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                data.minUss = minUss;
10274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            }
10284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            data.avgUss = (long)( ((data.avgUss*(double)data.numPss)
10294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                    + (avgUss*(double)samples)) / (data.numPss+samples) );
10304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            if (maxUss > data.maxUss) {
10314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                data.maxUss = maxUss;
10324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            }
1033e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                            if (minRss < data.minRss) {
1034e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                                data.minRss = minRss;
1035e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                            }
1036e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                            data.avgRss = (long)( ((data.avgRss*(double)data.numPss)
1037e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                                    + (avgRss*(double)samples)) / (data.numPss+samples) );
1038e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                            if (maxRss > data.maxRss) {
1039e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                                data.maxRss = maxRss;
1040e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                            }
10414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        }
10424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        data.numPss += samples;
10434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    }
10444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                }
10454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
10464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
10474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
10484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
10494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void dumpCsv(PrintWriter pw,
10504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            boolean sepScreenStates, int[] screenStates, boolean sepMemStates,
10514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            int[] memStates, boolean sepProcStates, int[] procStates, long now) {
10524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        final int NSS = sepScreenStates ? screenStates.length : 1;
10534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        final int NMS = sepMemStates ? memStates.length : 1;
10544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        final int NPS = sepProcStates ? procStates.length : 1;
10554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int iss=0; iss<NSS; iss++) {
10564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            for (int ims=0; ims<NMS; ims++) {
10574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                for (int ips=0; ips<NPS; ips++) {
10584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int vsscreen = sepScreenStates ? screenStates[iss] : 0;
10594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int vsmem = sepMemStates ? memStates[ims] : 0;
10604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int vsproc = sepProcStates ? procStates[ips] : 0;
10614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int NSA = sepScreenStates ? 1 : screenStates.length;
10624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int NMA = sepMemStates ? 1 : memStates.length;
10634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    final int NPA = sepProcStates ? 1 : procStates.length;
10644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    long totalTime = 0;
10654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    for (int isa=0; isa<NSA; isa++) {
10664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        for (int ima=0; ima<NMA; ima++) {
10674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            for (int ipa=0; ipa<NPA; ipa++) {
10684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                final int vascreen = sepScreenStates ? 0 : screenStates[isa];
10694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                final int vamem = sepMemStates ? 0 : memStates[ima];
10704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                final int vaproc = sepProcStates ? 0 : procStates[ipa];
10714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                final int bucket = ((vsscreen + vascreen + vsmem + vamem)
10724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                        * STATE_COUNT) + vsproc + vaproc;
10734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                                totalTime += getDuration(bucket, now);
10744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                            }
10754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                        }
10764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    }
10774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.print(DumpUtils.CSV_SEP);
10784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                    pw.print(totalTime);
10794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                }
10804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
10814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
10824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
10834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
10843accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn    public void dumpPackageProcCheckin(PrintWriter pw, String pkgName, int uid, long vers,
10854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            String itemName, long now) {
10864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print("pkgproc,");
10874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(pkgName);
10884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(",");
10894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(uid);
10904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(",");
10914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(vers);
10924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(",");
10934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.print(DumpUtils.collapseString(pkgName, itemName));
10944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        dumpAllStateCheckin(pw, now);
10954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        pw.println();
10964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mPssTable.getKeyCount() > 0) {
10974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print("pkgpss,");
10984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(pkgName);
10994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(uid);
11014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(vers);
11034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(DumpUtils.collapseString(pkgName, itemName));
11054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            dumpAllPssCheckin(pw);
11064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.println();
11074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
1108ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn        if (mNumExcessiveCpu > 0 || mNumCachedKill > 0) {
11094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print("pkgkills,");
11104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(pkgName);
11114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(uid);
11134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(vers);
11154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(DumpUtils.collapseString(pkgName, itemName));
11174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
1118ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn            pw.print("0"); // was mNumExcessiveWake
11194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mNumExcessiveCpu);
11214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mNumCachedKill);
11234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mMinCachedKillPss);
11254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(":");
11264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mAvgCachedKillPss);
11274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(":");
11284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mMaxCachedKillPss);
11294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.println();
11304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
11314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
11324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
11334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void dumpProcCheckin(PrintWriter pw, String procName, int uid, long now) {
11344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mDurations.getKeyCount() > 0) {
11354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print("proc,");
11364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(procName);
11374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(uid);
11394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            dumpAllStateCheckin(pw, now);
11404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.println();
11414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
11424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mPssTable.getKeyCount() > 0) {
11434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print("pss,");
11444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(procName);
11454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(uid);
11474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            dumpAllPssCheckin(pw);
11484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.println();
11494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
1150ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn        if (mNumExcessiveCpu > 0 || mNumCachedKill > 0) {
11514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print("kills,");
11524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(procName);
11534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(uid);
11554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
1156ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn            pw.print("0"); // was mNumExcessiveWake
11574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mNumExcessiveCpu);
11594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mNumCachedKill);
11614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(",");
11624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mMinCachedKillPss);
11634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(":");
11644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mAvgCachedKillPss);
11654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(":");
11664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mMaxCachedKillPss);
11674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.println();
11684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
11694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
11704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
11714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void dumpAllStateCheckin(PrintWriter pw, long now) {
11724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        boolean didCurState = false;
11734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int i=0; i<mDurations.getKeyCount(); i++) {
11744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            final int key = mDurations.getKeyAt(i);
11754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            final int type = SparseMappingTable.getIdFromKey(key);
11764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            long time = mDurations.getValue(key);
11774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            if (mCurState == type) {
11784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                didCurState = true;
11794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                time += now - mStartTime;
11804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            }
11814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            DumpUtils.printProcStateTagAndValue(pw, type, time);
11824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
11834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (!didCurState && mCurState != STATE_NOTHING) {
11844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            DumpUtils.printProcStateTagAndValue(pw, mCurState, now - mStartTime);
11854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
11864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
11874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
11884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public void dumpAllPssCheckin(PrintWriter pw) {
11894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        final int N = mPssTable.getKeyCount();
11904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        for (int i=0; i<N; i++) {
11914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            final int key = mPssTable.getKeyAt(i);
11924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            final int type = SparseMappingTable.getIdFromKey(key);
11934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(',');
11944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            DumpUtils.printProcStateTag(pw, type);
11954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(':');
11964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mPssTable.getValue(key, PSS_SAMPLE_COUNT));
11974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(':');
11984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mPssTable.getValue(key, PSS_MINIMUM));
11994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(':');
12004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mPssTable.getValue(key, PSS_AVERAGE));
12014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(':');
12024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mPssTable.getValue(key, PSS_MAXIMUM));
12034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(':');
12044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mPssTable.getValue(key, PSS_USS_MINIMUM));
12054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(':');
12064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mPssTable.getValue(key, PSS_USS_AVERAGE));
12074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(':');
12084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato            pw.print(mPssTable.getValue(key, PSS_USS_MAXIMUM));
1209e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.print(':');
1210e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.print(mPssTable.getValue(key, PSS_RSS_MINIMUM));
1211e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.print(':');
1212e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.print(mPssTable.getValue(key, PSS_RSS_AVERAGE));
1213e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.print(':');
1214e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.print(mPssTable.getValue(key, PSS_RSS_MAXIMUM));
12154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
12164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
12174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato
12189680cfae052a37969e4d3febc6a71ffda265030aYi Jin    @Override
12194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    public String toString() {
12204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        StringBuilder sb = new StringBuilder(128);
12214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this)))
12224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                .append(" ").append(mName).append("/").append(mUid)
12234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato                .append(" pkg=").append(mPackage);
12244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mMultiPackage) sb.append(" (multi)");
12254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mCommonProcess != this) sb.append(" (sub)");
12264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        sb.append("}");
12274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        return sb.toString();
12284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato    }
12299680cfae052a37969e4d3febc6a71ffda265030aYi Jin
1230676d1ace1cc57d2335bfaabd92284d52d8fc4edfYi Jin    public void writeToProto(ProtoOutputStream proto, long fieldId,
1231676d1ace1cc57d2335bfaabd92284d52d8fc4edfYi Jin            String procName, int uid, long now) {
1232676d1ace1cc57d2335bfaabd92284d52d8fc4edfYi Jin        final long token = proto.start(fieldId);
12339680cfae052a37969e4d3febc6a71ffda265030aYi Jin        proto.write(ProcessStatsProto.PROCESS, procName);
12349680cfae052a37969e4d3febc6a71ffda265030aYi Jin        proto.write(ProcessStatsProto.UID, uid);
12359680cfae052a37969e4d3febc6a71ffda265030aYi Jin        if (mNumExcessiveCpu > 0 || mNumCachedKill > 0 ) {
12369680cfae052a37969e4d3febc6a71ffda265030aYi Jin            final long killToken = proto.start(ProcessStatsProto.KILL);
12379680cfae052a37969e4d3febc6a71ffda265030aYi Jin            proto.write(ProcessStatsProto.Kill.CPU, mNumExcessiveCpu);
12389680cfae052a37969e4d3febc6a71ffda265030aYi Jin            proto.write(ProcessStatsProto.Kill.CACHED, mNumCachedKill);
12399680cfae052a37969e4d3febc6a71ffda265030aYi Jin            ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.Kill.CACHED_PSS,
12409680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    mMinCachedKillPss, mAvgCachedKillPss, mMaxCachedKillPss);
12419680cfae052a37969e4d3febc6a71ffda265030aYi Jin            proto.end(killToken);
12429680cfae052a37969e4d3febc6a71ffda265030aYi Jin        }
12439680cfae052a37969e4d3febc6a71ffda265030aYi Jin
12449680cfae052a37969e4d3febc6a71ffda265030aYi Jin        // Group proc stats by type (screen state + mem state + process state)
12459680cfae052a37969e4d3febc6a71ffda265030aYi Jin        Map<Integer, Long> durationByState = new HashMap<>();
12469680cfae052a37969e4d3febc6a71ffda265030aYi Jin        boolean didCurState = false;
12479680cfae052a37969e4d3febc6a71ffda265030aYi Jin        for (int i=0; i<mDurations.getKeyCount(); i++) {
12489680cfae052a37969e4d3febc6a71ffda265030aYi Jin            final int key = mDurations.getKeyAt(i);
12499680cfae052a37969e4d3febc6a71ffda265030aYi Jin            final int type = SparseMappingTable.getIdFromKey(key);
12509680cfae052a37969e4d3febc6a71ffda265030aYi Jin            long time = mDurations.getValue(key);
12519680cfae052a37969e4d3febc6a71ffda265030aYi Jin            if (mCurState == type) {
12529680cfae052a37969e4d3febc6a71ffda265030aYi Jin                didCurState = true;
12539680cfae052a37969e4d3febc6a71ffda265030aYi Jin                time += now - mStartTime;
12549680cfae052a37969e4d3febc6a71ffda265030aYi Jin            }
12559680cfae052a37969e4d3febc6a71ffda265030aYi Jin            durationByState.put(type, time);
12569680cfae052a37969e4d3febc6a71ffda265030aYi Jin        }
12579680cfae052a37969e4d3febc6a71ffda265030aYi Jin        if (!didCurState && mCurState != STATE_NOTHING) {
12589680cfae052a37969e4d3febc6a71ffda265030aYi Jin            durationByState.put(mCurState, now - mStartTime);
12599680cfae052a37969e4d3febc6a71ffda265030aYi Jin        }
12609680cfae052a37969e4d3febc6a71ffda265030aYi Jin
12619680cfae052a37969e4d3febc6a71ffda265030aYi Jin        for (int i=0; i<mPssTable.getKeyCount(); i++) {
12629680cfae052a37969e4d3febc6a71ffda265030aYi Jin            final int key = mPssTable.getKeyAt(i);
12639680cfae052a37969e4d3febc6a71ffda265030aYi Jin            final int type = SparseMappingTable.getIdFromKey(key);
12649680cfae052a37969e4d3febc6a71ffda265030aYi Jin            if (!durationByState.containsKey(type)) {
12659680cfae052a37969e4d3febc6a71ffda265030aYi Jin                // state without duration should not have stats!
12669680cfae052a37969e4d3febc6a71ffda265030aYi Jin                continue;
12679680cfae052a37969e4d3febc6a71ffda265030aYi Jin            }
12689680cfae052a37969e4d3febc6a71ffda265030aYi Jin            final long stateToken = proto.start(ProcessStatsProto.STATES);
12699680cfae052a37969e4d3febc6a71ffda265030aYi Jin            DumpUtils.printProcStateTagProto(proto,
12709680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    ProcessStatsProto.State.SCREEN_STATE,
12719680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    ProcessStatsProto.State.MEMORY_STATE,
12729680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    ProcessStatsProto.State.PROCESS_STATE,
12739680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    type);
12749680cfae052a37969e4d3febc6a71ffda265030aYi Jin
12759680cfae052a37969e4d3febc6a71ffda265030aYi Jin            long duration = durationByState.get(type);
12769680cfae052a37969e4d3febc6a71ffda265030aYi Jin            durationByState.remove(type); // remove the key since it is already being dumped.
12779680cfae052a37969e4d3febc6a71ffda265030aYi Jin            proto.write(ProcessStatsProto.State.DURATION_MS, duration);
12789680cfae052a37969e4d3febc6a71ffda265030aYi Jin
12799680cfae052a37969e4d3febc6a71ffda265030aYi Jin            proto.write(ProcessStatsProto.State.SAMPLE_SIZE, mPssTable.getValue(key, PSS_SAMPLE_COUNT));
12809680cfae052a37969e4d3febc6a71ffda265030aYi Jin            ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.State.PSS,
12819680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    mPssTable.getValue(key, PSS_MINIMUM),
12829680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    mPssTable.getValue(key, PSS_AVERAGE),
12839680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    mPssTable.getValue(key, PSS_MAXIMUM));
12849680cfae052a37969e4d3febc6a71ffda265030aYi Jin            ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.State.USS,
12859680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    mPssTable.getValue(key, PSS_USS_MINIMUM),
12869680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    mPssTable.getValue(key, PSS_USS_AVERAGE),
12879680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    mPssTable.getValue(key, PSS_USS_MAXIMUM));
1288e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.State.RSS,
1289e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                    mPssTable.getValue(key, PSS_RSS_MINIMUM),
1290e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                    mPssTable.getValue(key, PSS_RSS_AVERAGE),
1291e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                    mPssTable.getValue(key, PSS_RSS_MAXIMUM));
12929680cfae052a37969e4d3febc6a71ffda265030aYi Jin
12939680cfae052a37969e4d3febc6a71ffda265030aYi Jin            proto.end(stateToken);
12949680cfae052a37969e4d3febc6a71ffda265030aYi Jin        }
12959680cfae052a37969e4d3febc6a71ffda265030aYi Jin
12969680cfae052a37969e4d3febc6a71ffda265030aYi Jin        for (Map.Entry<Integer, Long> entry : durationByState.entrySet()) {
12979680cfae052a37969e4d3febc6a71ffda265030aYi Jin            final long stateToken = proto.start(ProcessStatsProto.STATES);
12989680cfae052a37969e4d3febc6a71ffda265030aYi Jin            DumpUtils.printProcStateTagProto(proto,
12999680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    ProcessStatsProto.State.SCREEN_STATE,
13009680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    ProcessStatsProto.State.MEMORY_STATE,
13019680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    ProcessStatsProto.State.PROCESS_STATE,
13029680cfae052a37969e4d3febc6a71ffda265030aYi Jin                    entry.getKey());
13039680cfae052a37969e4d3febc6a71ffda265030aYi Jin            proto.write(ProcessStatsProto.State.DURATION_MS, entry.getValue());
13049680cfae052a37969e4d3febc6a71ffda265030aYi Jin            proto.end(stateToken);
13059680cfae052a37969e4d3febc6a71ffda265030aYi Jin        }
1306676d1ace1cc57d2335bfaabd92284d52d8fc4edfYi Jin        proto.end(token);
13079680cfae052a37969e4d3febc6a71ffda265030aYi Jin    }
13084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato}
1309