1d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn/*
2d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Copyright (C) 2013 The Android Open Source Project
3d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn *
4d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * you may not use this file except in compliance with the License.
6d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * You may obtain a copy of the License at
7d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn *
8d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn *
10d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
11d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * See the License for the specific language governing permissions and
14d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * limitations under the License.
15d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */
16d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
17d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornpackage com.android.internal.app;
18d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
19d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.Parcel;
2023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackbornimport android.os.Parcelable;
21d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.SystemClock;
22d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.SystemProperties;
23d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.UserHandle;
24d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.text.format.DateFormat;
25d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.ArrayMap;
26d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.ArraySet;
2750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackbornimport android.util.Log;
28d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.Slog;
29d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.SparseArray;
30d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.TimeUtils;
31d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.webkit.WebViewFactory;
32d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport com.android.internal.util.ArrayUtils;
33d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport dalvik.system.VMRuntime;
34d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.IOException;
3660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.InputStream;
37d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.io.PrintWriter;
38d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.ArrayList;
39d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Arrays;
40d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Collections;
41d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Comparator;
42d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Objects;
43d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
448a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackbornpublic final class ProcessStats implements Parcelable {
45d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String TAG = "ProcessStats";
46d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final boolean DEBUG = false;
47164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn    static final boolean DEBUG_PARCEL = false;
488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
498a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final String SERVICE_NAME = "procstats";
508a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
51cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    // How often the service commits its data, giving the minimum batching
52cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    // that is done.
53cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    public static long COMMIT_PERIOD = 3*60*60*1000;  // Commit current stats every 3 hours
54cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
55d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_NOTHING = -1;
56d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_PERSISTENT = 0;
57d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_TOP = 1;
58d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_IMPORTANT_FOREGROUND = 2;
59d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_IMPORTANT_BACKGROUND = 3;
60d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_BACKUP = 4;
61d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_HEAVY_WEIGHT = 5;
62d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_SERVICE = 6;
63d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_SERVICE_RESTARTING = 7;
64d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_RECEIVER = 8;
65d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_HOME = 9;
66d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_LAST_ACTIVITY = 10;
67d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_CACHED_ACTIVITY = 11;
68d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_CACHED_ACTIVITY_CLIENT = 12;
69d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_CACHED_EMPTY = 13;
70d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_COUNT = STATE_CACHED_EMPTY+1;
71d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
72d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_SAMPLE_COUNT = 0;
73d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_MINIMUM = 1;
74d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_AVERAGE = 2;
75d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_MAXIMUM = 3;
76d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_USS_MINIMUM = 4;
77d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_USS_AVERAGE = 5;
78d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_USS_MAXIMUM = 6;
79d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_COUNT = PSS_USS_MAXIMUM+1;
80d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
81d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_NOTHING = -1;
82d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_NORMAL = 0;
83d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_MODERATE = 1;
84d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_LOW = 2;
85d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_CRITICAL = 3;
86d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1;
87d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT;
88d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_SCREEN_OFF = 0;
89d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD;
90d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_COUNT = ADJ_SCREEN_ON*2;
91d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
92d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int FLAG_COMPLETE = 1<<0;
93d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int FLAG_SHUTDOWN = 1<<1;
94d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int FLAG_SYSPROPS = 1<<2;
95d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL,
978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL };
988a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON };
1008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
1018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] NON_CACHED_PROC_STATES = new int[] {
1028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND,
103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT,
1048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER
1058a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    };
1068a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
1078a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] BACKGROUND_PROC_STATES = new int[] {
1088a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP,
1098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER
110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Map from process states to the states we track.
113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final int[] PROCESS_STATE_TO_STATE = new int[] {
114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT
115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT_UI
116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_TOP,                      // ActivityManager.PROCESS_STATE_TOP
117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_IMPORTANT_BACKGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_BACKUP,                   // ActivityManager.PROCESS_STATE_BACKUP
120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HEAVY_WEIGHT,             // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_SERVICE,                  // ActivityManager.PROCESS_STATE_SERVICE
122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_RECEIVER,                 // ActivityManager.PROCESS_STATE_RECEIVER
123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HOME,                     // ActivityManager.PROCESS_STATE_HOME
124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_LAST_ACTIVITY,            // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_ACTIVITY,          // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_ACTIVITY_CLIENT,   // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_EMPTY,             // ActivityManager.PROCESS_STATE_CACHED_EMPTY
128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT,
131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP,
132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER,
133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY,
134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY
135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] STATE_NAMES = new String[] {
138237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            "Persist", "Top    ", "ImpFg  ", "ImpBg  ",
139237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            "Backup ", "HeavyWt", "Service", "ServRst",
140237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            "Receivr", "Home   ",
141237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            "LastAct", "CchAct ", "CchCAct", "CchEmty"
142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] {
145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "off", "on"
146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final String[] ADJ_MEM_NAMES_CSV = new String[] {
149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "norm", "mod",  "low", "crit"
150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final String[] STATE_NAMES_CSV = new String[] {
153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "pers", "top", "impfg", "impbg", "backup", "heavy",
154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "service", "service-rs", "receiver", "home", "lastact",
155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "cch-activity", "cch-aclient", "cch-empty"
156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] ADJ_SCREEN_TAGS = new String[] {
159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "0", "1"
160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] ADJ_MEM_TAGS = new String[] {
163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "n", "m",  "l", "c"
164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] STATE_TAGS = new String[] {
167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "p", "t", "f", "b", "u", "w",
168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "s", "x", "r", "h", "l", "a", "c", "e"
169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String CSV_SEP = "\t";
172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Current version of the parcel format.
1743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    private static final int PARCEL_VERSION = 13;
175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private static final int MAGIC = 0x50535453;
177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Where the "type"/"state" part of the data appears in an offset integer.
179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_TYPE_SHIFT = 0;
180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_TYPE_MASK = 0xff;
181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Where the "which array" part of the data appears in an offset integer.
182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_ARRAY_SHIFT = 8;
183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_ARRAY_MASK = 0xff;
184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Where the "index into array" part of the data appears in an offset integer.
185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_INDEX_SHIFT = 16;
186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_INDEX_MASK = 0xffff;
187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public String mReadError;
189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public String mTimePeriodStartClockStr;
190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public int mFlags;
191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public final ProcessMap<PackageState> mPackages = new ProcessMap<PackageState>();
193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>();
194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public final long[] mMemFactorDurations = new long[ADJ_COUNT];
196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public int mMemFactor = STATE_NOTHING;
197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mStartTime;
198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mTimePeriodStartClock;
200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mTimePeriodStartRealtime;
201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mTimePeriodEndRealtime;
202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    String mRuntime;
203d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    String mWebView;
204d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    boolean mRunning;
205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final int LONGS_SIZE = 4096;
207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    final ArrayList<long[]> mLongs = new ArrayList<long[]>();
208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int mNextLong;
209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int[] mAddLongTable;
211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int mAddLongTableSize;
212d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
213be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    // For writing parcels.
214be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    ArrayMap<String, Integer> mCommonStringToIndex;
215be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
216be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    // For reading parcels.
217be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    ArrayList<String> mIndexToCommonString;
218be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public ProcessStats(boolean running) {
220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mRunning = running;
221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        reset();
222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
22423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public ProcessStats(Parcel in) {
22523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        reset();
22623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        readFromParcel(in);
22723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    }
22823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
22960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    public void add(ProcessStats other) {
23060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = other.mPackages.getMap();
23160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
23260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            String pkgName = pkgMap.keyAt(ip);
23360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
23460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
23560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int uid = uids.keyAt(iu);
23660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                PackageState otherState = uids.valueAt(iu);
23760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                final int NPROCS = otherState.mProcesses.size();
23860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                final int NSRVS = otherState.mServices.size();
23960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                for (int iproc=0; iproc<NPROCS; iproc++) {
24060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    ProcessState otherProc = otherState.mProcesses.valueAt(iproc);
24160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (otherProc.mCommonProcess != otherProc) {
24260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid
24360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                + " proc " + otherProc.mName);
24460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        ProcessState thisProc = getProcessStateLocked(pkgName, uid,
24560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                otherProc.mName);
24660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        if (thisProc.mCommonProcess == thisProc) {
24760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting");
24860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            thisProc.mMultiPackage = true;
24960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            long now = SystemClock.uptimeMillis();
25060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            final PackageState pkgState = getPackageStateLocked(pkgName, uid);
25160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            thisProc = thisProc.clone(thisProc.mPackage, now);
25260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            pkgState.mProcesses.put(thisProc.mName, thisProc);
25360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        }
25460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        thisProc.add(otherProc);
25560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    }
25660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
25760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
25860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    ServiceState otherSvc = otherState.mServices.valueAt(isvc);
25960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid
26060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            + " service " + otherSvc.mName);
26160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    ServiceState thisSvc = getServiceStateLocked(pkgName, uid,
262be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                            otherSvc.mProcessName, otherSvc.mName);
26360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    thisSvc.add(otherSvc);
26460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
26560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
26660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
26760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
26860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap();
26960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        for (int ip=0; ip<procMap.size(); ip++) {
27060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
27160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
27260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int uid = uids.keyAt(iu);
27360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                ProcessState otherProc = uids.valueAt(iu);
27460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                ProcessState thisProc = mProcesses.get(otherProc.mName, uid);
27560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + otherProc.mName);
27660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (thisProc == null) {
27760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "Creating new process!");
27860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    thisProc = new ProcessState(this, otherProc.mPackage, uid, otherProc.mName);
27960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    mProcesses.put(otherProc.mName, uid, thisProc);
28060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    PackageState thisState = getPackageStateLocked(otherProc.mPackage, uid);
28160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (!thisState.mProcesses.containsKey(otherProc.mName)) {
28260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        thisState.mProcesses.put(otherProc.mName, thisProc);
28360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    }
28460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
28560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                thisProc.add(otherProc);
28660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
28760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
28860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
28960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        for (int i=0; i<ADJ_COUNT; i++) {
29060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by "
29160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    + other.mMemFactorDurations[i] + " from "
29260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    + mMemFactorDurations[i]);
29360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mMemFactorDurations[i] += other.mMemFactorDurations[i];
29460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
29560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
29660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        if (other.mTimePeriodStartClock < mTimePeriodStartClock) {
29760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mTimePeriodStartClock = other.mTimePeriodStartClock;
29860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mTimePeriodStartClockStr = other.mTimePeriodStartClockStr;
29960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
30060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime;
30160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
30260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
30323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public static final Parcelable.Creator<ProcessStats> CREATOR
30423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            = new Parcelable.Creator<ProcessStats>() {
30523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        public ProcessStats createFromParcel(Parcel in) {
30623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            return new ProcessStats(in);
30723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        }
30823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
30923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        public ProcessStats[] newArray(int size) {
31023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            return new ProcessStats[size];
31123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        }
31223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    };
31323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
3148a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    private static void printScreenLabel(PrintWriter pw, int offset) {
315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        switch (offset) {
316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_NOTHING:
317237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("     ");
318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
319d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_OFF:
320237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("SOff/");
321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_ON:
323237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("SOn /");
324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            default:
326237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("????/");
327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static void printScreenLabelCsv(PrintWriter pw, int offset) {
332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        switch (offset) {
333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_NOTHING:
334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_OFF:
336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(ADJ_SCREEN_NAMES_CSV[0]);
337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_ON:
339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(ADJ_SCREEN_NAMES_CSV[1]);
340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            default:
342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("???");
343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
347237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn    private static void printMemLabel(PrintWriter pw, int offset, char sep) {
348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        switch (offset) {
349d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_NOTHING:
350237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("    ");
351237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(' ');
352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_NORMAL:
354237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("Norm");
355237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_MODERATE:
358237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("Mod ");
359237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_LOW:
362237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("Low ");
363237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_CRITICAL:
366237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("Crit");
367237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            default:
370237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("????");
371237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3768a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static void printMemLabelCsv(PrintWriter pw, int offset) {
377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (offset >= ADJ_MEM_FACTOR_NORMAL) {
378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (offset <= ADJ_MEM_FACTOR_CRITICAL) {
379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(ADJ_MEM_NAMES_CSV[offset]);
380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("???");
382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3868a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static long dumpSingleTime(PrintWriter pw, String prefix, long[] durations,
387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int curState, long curStartTime, long now) {
388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int state = imem+iscreen;
394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long time = durations[state];
395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                String running = "";
396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (curState == state) {
397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    time += now - curStartTime;
398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (pw != null) {
399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        running = " (running)";
400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (time != 0) {
403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (pw != null) {
404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printScreenLabel(pw, printedScreen != iscreen
406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ? iscreen : STATE_NOTHING);
407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedScreen = iscreen;
408237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0);
409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedMem = imem;
410237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        pw.print(": ");
411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        TimeUtils.formatDuration(time, pw); pw.println(running);
412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    totalTime += time;
414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totalTime != 0 && pw != null) {
418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
419237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print("    TOTAL: ");
420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            TimeUtils.formatDuration(totalTime, pw);
421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return totalTime;
424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpAdjTimesCheckin(PrintWriter pw, String sep, long[] durations,
427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int curState, long curStartTime, long now) {
428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int state = imem+iscreen;
431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long time = durations[state];
432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (curState == state) {
433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    time += now - curStartTime;
434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (time != 0) {
436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    printAdjTagAndValue(pw, state, time);
437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpServiceTimeCheckin(PrintWriter pw, String label, String packageName,
443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int uid, String serviceName, ServiceState svc, int serviceType, int opCount,
444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int curState, long curStartTime, long now) {
445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (opCount <= 0) {
446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(label);
449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(packageName);
451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(uid);
453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(serviceName);
455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(opCount);
457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean didCurState = false;
458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<svc.mDurationsTableSize; i++) {
459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int off = svc.mDurationsTable[i];
460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int memFactor = type / ServiceState.SERVICE_COUNT;
462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            type %= ServiceState.SERVICE_COUNT;
463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (type != serviceType) {
464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                continue;
465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
4668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long time = svc.mStats.getLong(off, 0);
467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (curState == memFactor) {
468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                didCurState = true;
469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - curStartTime;
470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printAdjTagAndValue(pw, memFactor, time);
472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!didCurState && curState != STATE_NOTHING) {
474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printAdjTagAndValue(pw, curState, now - curStartTime);
475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
4798a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static void computeProcessData(ProcessState proc, ProcessDataCollection data, long now) {
480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        data.totalTime = 0;
481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        data.numPss = data.minPss = data.avgPss = data.maxPss =
482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                data.minUss = data.avgUss = data.maxUss = 0;
483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<data.screenStates.length; is++) {
484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<data.memStates.length; im++) {
485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<data.procStates.length; ip++) {
486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT)
487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + data.procStates[ip];
488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    data.totalTime += proc.getDuration(bucket, now);
489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long samples = proc.getPssSampleCount(bucket);
490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (samples > 0) {
491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long minPss = proc.getPssMinimum(bucket);
492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long avgPss = proc.getPssAverage(bucket);
493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long maxPss = proc.getPssMaximum(bucket);
494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long minUss = proc.getPssUssMinimum(bucket);
495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long avgUss = proc.getPssUssAverage(bucket);
496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long maxUss = proc.getPssUssMaximum(bucket);
497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (data.numPss == 0) {
498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.minPss = minPss;
499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgPss = avgPss;
500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.maxPss = maxPss;
501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.minUss = minUss;
502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgUss = avgUss;
503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.maxUss = maxUss;
504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        } else {
505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (minPss < data.minPss) {
506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.minPss = minPss;
507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgPss = (long)( ((data.avgPss*(double)data.numPss)
509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    + (avgPss*(double)samples)) / (data.numPss+samples) );
510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (maxPss > data.maxPss) {
511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.maxPss = maxPss;
512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (minUss < data.minUss) {
514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.minUss = minUss;
515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgUss = (long)( ((data.avgUss*(double)data.numPss)
517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    + (avgUss*(double)samples)) / (data.numPss+samples) );
518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (maxUss > data.maxUss) {
519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.maxUss = maxUss;
520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        data.numPss += samples;
523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
527d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
528d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static long computeProcessTimeLocked(ProcessState proc, int[] screenStates, int[] memStates,
530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int[] procStates, long now) {
531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /*
533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<proc.mDurationsTableSize; i++) {
534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int val = proc.mDurationsTable[i];
535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            totalTime += proc.mState.getLong(val, 0);
536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if ((val&0xff) == proc.mCurState) {
537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                totalTime += now - proc.mStartTime;
538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        */
541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<screenStates.length; is++) {
542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<memStates.length; im++) {
543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<procStates.length; ip++) {
544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT)
545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + procStates[ip];
546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    totalTime += proc.getDuration(bucket, now);
547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        proc.mTmpTotalTime = totalTime;
551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return totalTime;
552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessState(PrintWriter pw, String prefix, ProcessState proc,
555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] screenStates, int[] memStates, int[] procStates, long now) {
556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<screenStates.length; is++) {
559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<memStates.length; im++) {
561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<procStates.length; ip++) {
562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int iscreen = screenStates[is];
563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int imem = memStates[im];
564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long time = proc.getDuration(bucket, now);
566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    String running = "";
567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (proc.mCurState == bucket) {
568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        running = " (running)";
569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (time != 0) {
571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (screenStates.length > 1) {
573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printScreenLabel(pw, printedScreen != iscreen
574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    ? iscreen : STATE_NOTHING);
575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedScreen = iscreen;
576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (memStates.length > 1) {
578237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                            printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/');
579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedMem = imem;
580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        TimeUtils.formatDuration(time, pw); pw.println(running);
583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        totalTime += time;
584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totalTime != 0) {
589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (screenStates.length > 1) {
591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printScreenLabel(pw, STATE_NOTHING);
592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (memStates.length > 1) {
594237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                printMemLabel(pw, STATE_NOTHING, '/');
595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
596237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print("TOTAL  : ");
597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            TimeUtils.formatDuration(totalTime, pw);
598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessPss(PrintWriter pw, String prefix, ProcessState proc, int[] screenStates,
603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] memStates, int[] procStates) {
604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean printedHeader = false;
605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<screenStates.length; is++) {
607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<memStates.length; im++) {
609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<procStates.length; ip++) {
610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int iscreen = screenStates[is];
611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int imem = memStates[im];
612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long count = proc.getPssSampleCount(bucket);
614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (count > 0) {
615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (!printedHeader) {
616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print(prefix);
617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("PSS/USS (");
618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print(proc.mPssTableSize);
619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.println(" entries):");
620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedHeader = true;
621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("  ");
624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (screenStates.length > 1) {
625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printScreenLabel(pw, printedScreen != iscreen
626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    ? iscreen : STATE_NOTHING);
627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedScreen = iscreen;
628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (memStates.length > 1) {
630237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                            printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/');
631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedMem = imem;
632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(count);
635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" samples ");
636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssMinimum(bucket) * 1024);
637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssAverage(bucket) * 1024);
639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssMaximum(bucket) * 1024);
641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" / ");
642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssUssMinimum(bucket) * 1024);
643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssUssAverage(bucket) * 1024);
645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssUssMaximum(bucket) * 1024);
647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println();
648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (proc.mNumExcessiveWake != 0) {
653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix); pw.print("Killed for excessive wake locks: ");
654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(proc.mNumExcessiveWake); pw.println(" times");
655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (proc.mNumExcessiveCpu != 0) {
657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix); pw.print("Killed for excessive CPU use: ");
658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(proc.mNumExcessiveCpu); pw.println(" times");
659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
6603bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        if (proc.mNumCachedKill != 0) {
6613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pw.print(prefix); pw.print("Killed from cached state: ");
6623bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(proc.mNumCachedKill); pw.print(" times from pss ");
6633bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    printSizeValue(pw, proc.mMinCachedKillPss * 1024); pw.print("-");
6643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    printSizeValue(pw, proc.mAvgCachedKillPss * 1024); pw.print("-");
6653bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    printSizeValue(pw, proc.mMaxCachedKillPss * 1024); pw.println();
6663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpStateHeadersCsv(PrintWriter pw, String sep, int[] screenStates,
670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] memStates, int[] procStates) {
671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NS = screenStates != null ? screenStates.length : 1;
672d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NM = memStates != null ? memStates.length : 1;
673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NP = procStates != null ? procStates.length : 1;
674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<NS; is++) {
675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<NM; im++) {
676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<NP; ip++) {
677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(sep);
678d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    boolean printed = false;
679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (screenStates != null && screenStates.length > 1) {
680d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printScreenLabelCsv(pw, screenStates[is]);
681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printed = true;
682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (memStates != null && memStates.length > 1) {
684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (printed) {
685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("-");
686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printMemLabelCsv(pw, memStates[im]);
688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printed = true;
689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (procStates != null && procStates.length > 1) {
691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (printed) {
692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("-");
693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(STATE_NAMES_CSV[procStates[ip]]);
695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessStateCsv(PrintWriter pw, ProcessState proc,
702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepProcStates, int[] procStates, long now) {
704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NSS = sepScreenStates ? screenStates.length : 1;
705d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NMS = sepMemStates ? memStates.length : 1;
706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NPS = sepProcStates ? procStates.length : 1;
707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iss=0; iss<NSS; iss++) {
708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ims=0; ims<NMS; ims++) {
709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ips=0; ips<NPS; ips++) {
710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int vsscreen = sepScreenStates ? screenStates[iss] : 0;
711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int vsmem = sepMemStates ? memStates[ims] : 0;
712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int vsproc = sepProcStates ? procStates[ips] : 0;
713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int NSA = sepScreenStates ? 1 : screenStates.length;
714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int NMA = sepMemStates ? 1 : memStates.length;
715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int NPA = sepProcStates ? 1 : procStates.length;
716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long totalTime = 0;
717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int isa=0; isa<NSA; isa++) {
718d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        for (int ima=0; ima<NMA; ima++) {
719d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            for (int ipa=0; ipa<NPA; ipa++) {
720d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int vascreen = sepScreenStates ? 0 : screenStates[isa];
721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int vamem = sepMemStates ? 0 : memStates[ima];
722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int vaproc = sepProcStates ? 0 : procStates[ipa];
723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int bucket = ((vsscreen + vascreen + vsmem + vamem)
724d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                        * STATE_COUNT) + vsproc + vaproc;
725d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                totalTime += proc.getDuration(bucket, now);
726d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
727d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
729d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(CSV_SEP);
730d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(totalTime);
731d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
732d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
733d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
734d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
736d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessList(PrintWriter pw, String prefix, ArrayList<ProcessState> procs,
737d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] screenStates, int[] memStates, int[] procStates, long now) {
738d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String innerPrefix = prefix + "  ";
739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=procs.size()-1; i>=0; i--) {
740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = procs.get(i);
741d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mName);
743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" / ");
744d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            UserHandle.formatUid(pw, proc.mUid);
745d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (");
746d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mDurationsTableSize);
747d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" entries)");
748d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println(":");
749d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessState(pw, innerPrefix, proc, screenStates, memStates, procStates, now);
750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (proc.mPssTableSize > 0) {
751d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                dumpProcessPss(pw, innerPrefix, proc, screenStates, memStates, procStates);
752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
755d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessSummaryDetails(PrintWriter pw, ProcessState proc, String prefix,
757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String label, int[] screenStates, int[] memStates, int[] procStates,
758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            long now, long totalTime, boolean full) {
759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessDataCollection totals = new ProcessDataCollection(screenStates,
760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                memStates, procStates);
761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        computeProcessData(proc, totals, now);
762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totals.totalTime != 0 || totals.numPss != 0) {
763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (prefix != null) {
764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(prefix);
765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (label != null) {
767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(label);
768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            totals.print(pw, totalTime, full);
770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (prefix != null) {
771d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println();
772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
776d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessSummaryLocked(PrintWriter pw, String prefix,
777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ArrayList<ProcessState> procs, int[] screenStates, int[] memStates, int[] procStates,
778d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            long now, long totalTime) {
779d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=procs.size()-1; i>=0; i--) {
780d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = procs.get(i);
781d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
782d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("* ");
783d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mName);
784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" / ");
785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            UserHandle.formatUid(pw, proc.mUid);
786d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println(":");
787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "         TOTAL: ", screenStates, memStates,
788d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    procStates, now, totalTime, true);
789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "    Persistent: ", screenStates, memStates,
790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] { STATE_PERSISTENT }, now, totalTime, true);
791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "           Top: ", screenStates, memStates,
792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_TOP}, now, totalTime, true);
793d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        Imp Fg: ", screenStates, memStates,
794d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true);
795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        Imp Bg: ", screenStates, memStates,
796d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true);
797d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        Backup: ", screenStates, memStates,
798d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_BACKUP}, now, totalTime, true);
799d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "     Heavy Wgt: ", screenStates, memStates,
800d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true);
801d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "       Service: ", screenStates, memStates,
802d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_SERVICE}, now, totalTime, true);
803d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "    Service Rs: ", screenStates, memStates,
804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true);
805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "      Receiver: ", screenStates, memStates,
806d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_RECEIVER}, now, totalTime, true);
807237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        (Home): ", screenStates, memStates,
808d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_HOME}, now, totalTime, true);
809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "    (Last Act): ", screenStates, memStates,
810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true);
811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "      (Cached): ", screenStates, memStates,
812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT,
813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            STATE_CACHED_EMPTY}, now, totalTime, true);
814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printPercent(PrintWriter pw, double fraction) {
818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        fraction *= 100;
819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (fraction < 1) {
820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(String.format("%.2f", fraction));
821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else if (fraction < 10) {
822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(String.format("%.1f", fraction));
823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(String.format("%.0f", fraction));
825d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
826d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("%");
827d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printSizeValue(PrintWriter pw, long number) {
830d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        float result = number;
831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String suffix = "";
832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "KB";
834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "MB";
838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
840d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
841d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "GB";
842d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "TB";
846d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "PB";
850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String value;
853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result < 1) {
854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            value = String.format("%.2f", result);
855d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else if (result < 10) {
856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            value = String.format("%.1f", result);
857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else if (result < 100) {
858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            value = String.format("%.0f", result);
859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            value = String.format("%.0f", result);
861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(value);
863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(suffix);
864d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static void dumpProcessListCsv(PrintWriter pw, ArrayList<ProcessState> procs,
867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepProcStates, int[] procStates, long now) {
869d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("process");
870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(CSV_SEP);
871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("uid");
872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpStateHeadersCsv(pw, CSV_SEP, sepScreenStates ? screenStates : null,
873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                sepMemStates ? memStates : null,
874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                sepProcStates ? procStates : null);
875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=procs.size()-1; i>=0; i--) {
877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = procs.get(i);
878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mName);
879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(CSV_SEP);
880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            UserHandle.formatUid(pw, proc.mUid);
881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessStateCsv(pw, proc, sepScreenStates, screenStates,
882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    sepMemStates, memStates, sepProcStates, procStates, now);
883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int printArrayEntry(PrintWriter pw, String[] array, int value, int mod) {
888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int index = value/mod;
889d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (index >= 0 && index < array.length) {
890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(array[index]);
891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print('?');
893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return value - index*mod;
895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
896d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
897d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printProcStateTag(PrintWriter pw, int state) {
898d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        state = printArrayEntry(pw, ADJ_SCREEN_TAGS,  state, ADJ_SCREEN_MOD*STATE_COUNT);
899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        state = printArrayEntry(pw, ADJ_MEM_TAGS,  state, STATE_COUNT);
900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printArrayEntry(pw, STATE_TAGS,  state, 1);
901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
902d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
903d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printAdjTag(PrintWriter pw, int state) {
904d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        state = printArrayEntry(pw, ADJ_SCREEN_TAGS,  state, ADJ_SCREEN_MOD);
905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printArrayEntry(pw, ADJ_MEM_TAGS, state, 1);
906d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
908d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printProcStateTagAndValue(PrintWriter pw, int state, long value) {
909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(',');
910d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printProcStateTag(pw, state);
911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(':');
912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(value);
913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printAdjTagAndValue(PrintWriter pw, int state, long value) {
916d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(',');
917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printAdjTag(pw, state);
918d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(':');
919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(value);
920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
922d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpAllProcessStateCheckin(PrintWriter pw, ProcessState proc, long now) {
923d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean didCurState = false;
924d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<proc.mDurationsTableSize; i++) {
925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int off = proc.mDurationsTable[i];
926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
9278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long time = proc.mStats.getLong(off, 0);
928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (proc.mCurState == type) {
929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                didCurState = true;
930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - proc.mStartTime;
931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printProcStateTagAndValue(pw, type, time);
933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!didCurState && proc.mCurState != STATE_NOTHING) {
935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printProcStateTagAndValue(pw, proc.mCurState, now - proc.mStartTime);
936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpAllProcessPssCheckin(PrintWriter pw, ProcessState proc) {
940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<proc.mPssTableSize; i++) {
941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int off = proc.mPssTable[i];
942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
9438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long count = proc.mStats.getLong(off, PSS_SAMPLE_COUNT);
9448a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long min = proc.mStats.getLong(off, PSS_MINIMUM);
9458a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long avg = proc.mStats.getLong(off, PSS_AVERAGE);
9468a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long max = proc.mStats.getLong(off, PSS_MAXIMUM);
9478a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long umin = proc.mStats.getLong(off, PSS_USS_MINIMUM);
9488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long uavg = proc.mStats.getLong(off, PSS_USS_AVERAGE);
9498a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long umax = proc.mStats.getLong(off, PSS_USS_MAXIMUM);
950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(',');
951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printProcStateTag(pw, type);
952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(count);
954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(min);
956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(avg);
958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
959d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(max);
960d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(umin);
962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(uavg);
964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(umax);
966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
968d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void reset() {
970d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr);
971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        resetCommon();
972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mPackages.getMap().clear();
973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mProcesses.getMap().clear();
974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mMemFactor = STATE_NOTHING;
975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mStartTime = 0;
976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr);
977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
979d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void resetSafely() {
980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr);
981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        resetCommon();
982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long now = SystemClock.uptimeMillis();
983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=procMap.size()-1; ip>=0; ip--) {
985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=uids.size()-1; iu>=0; iu--) {
987be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                ProcessState ps = uids.valueAt(iu);
988be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                if (ps.isInUse()) {
989be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    uids.valueAt(iu).resetSafely(now);
990be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                } else {
99150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                    uids.valueAt(iu).makeDead();
992be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    uids.removeAt(iu);
993be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                }
994be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
995be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (uids.size() <= 0) {
996be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                procMap.removeAt(ip);
997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
1000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=pkgMap.size()-1; ip>=0; ip--) {
1001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
1002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=uids.size()-1; iu>=0; iu--) {
1003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                PackageState pkgState = uids.valueAt(iu);
1004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) {
1005be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    ProcessState ps = pkgState.mProcesses.valueAt(iproc);
1006a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn                    if (ps.isInUse() || ps.mCommonProcess.isInUse()) {
1007be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                        pkgState.mProcesses.valueAt(iproc).resetSafely(now);
1008be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    } else {
100950ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                        pkgState.mProcesses.valueAt(iproc).makeDead();
1010be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                        pkgState.mProcesses.removeAt(iproc);
1011be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    }
1012d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) {
1014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ServiceState ss = pkgState.mServices.valueAt(isvc);
1015be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    if (ss.isInUse()) {
1016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pkgState.mServices.valueAt(isvc).resetSafely(now);
1017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
1018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pkgState.mServices.removeAt(isvc);
1019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1021be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) {
1022be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    uids.removeAt(iu);
1023be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                }
1024be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
1025be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (uids.size() <= 0) {
1026be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                pkgMap.removeAt(ip);
1027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1029cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        mStartTime = now;
1030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr);
1031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private void resetCommon() {
1034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartClock = System.currentTimeMillis();
1035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        buildTimePeriodStartClockStr();
1036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime();
1037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.clear();
1038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.add(new long[LONGS_SIZE]);
1039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mNextLong = 0;
1040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        Arrays.fill(mMemFactorDurations, 0);
1041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mStartTime = 0;
1042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mReadError = null;
1043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mFlags = 0;
1044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        evaluateSystemProperties(true);
1045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1046d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public boolean evaluateSystemProperties(boolean update) {
1048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean changed = false;
1049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib",
1050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                VMRuntime.getRuntime().vmLibrary());
1051d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!Objects.equals(runtime, mRuntime)) {
1052d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            changed = true;
1053d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (update) {
1054d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mRuntime = runtime;
1055d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1056d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1057d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String webview = WebViewFactory.useExperimentalWebView() ? "chromeview" : "webview";
1058d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!Objects.equals(webview, mWebView)) {
1059d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            changed = true;
1060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (update) {
1061d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mWebView = webview;
1062d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1063d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return changed;
1065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1066d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1067d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private void buildTimePeriodStartClockStr() {
1068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss",
1069d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mTimePeriodStartClock).toString();
1070d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1072d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final int[] BAD_TABLE = new int[0];
1073d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private int[] readTableFromParcel(Parcel in, String name, String what) {
1075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int size = in.readInt();
1076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (size < 0) {
1077d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            Slog.w(TAG, "Ignoring existing stats; bad " + what + " table size: " + size);
1078d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return BAD_TABLE;
1079d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1080d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (size == 0) {
1081d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return null;
1082d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1083d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] table = new int[size];
1084d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<size; i++) {
1085d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            table[i] = in.readInt();
1086164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG_PARCEL) Slog.i(TAG, "Reading in " + name + " table #" + i + ": "
1087d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    + ProcessStats.printLongOffset(table[i]));
1088d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!validateLongOffset(table[i])) {
1089d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: "
1090d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + ProcessStats.printLongOffset(table[i]));
1091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return null;
1092d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1093d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return table;
1095d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1096d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
109753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn    private void writeCompactedLongArray(Parcel out, long[] array, int num) {
109853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        for (int i=0; i<num; i++) {
1099be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            long val = array[i];
1100be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (val < 0) {
1101be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                Slog.w(TAG, "Time val negative: " + val);
1102be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                val = 0;
1103be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
1104be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (val <= Integer.MAX_VALUE) {
1105be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                out.writeInt((int)val);
1106be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            } else {
1107be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                int top = ~((int)((val>>32)&0x7fffffff));
1108be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                int bottom = (int)(val&0xfffffff);
1109be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                out.writeInt(top);
1110be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                out.writeInt(bottom);
1111be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
1112be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1113be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    }
1114be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
111553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn    private void readCompactedLongArray(Parcel in, int version, long[] array, int num) {
1116be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (version <= 10) {
1117be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            in.readLongArray(array);
1118be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            return;
1119be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
112053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        final int alen = array.length;
112153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        if (num > alen) {
112253459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            throw new RuntimeException("bad array lengths: got " + num + " array is " + alen);
1123be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
112453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        int i;
112553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        for (i=0; i<num; i++) {
1126be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            int val = in.readInt();
1127be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (val >= 0) {
1128be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                array[i] = val;
1129be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            } else {
1130be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                int bottom = in.readInt();
1131be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                array[i] = (((long)~val)<<32) | bottom;
1132be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
1133be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
113453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        while (i < alen) {
113553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            array[i] = 0;
113653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            i++;
113753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        }
1138be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    }
1139be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1140be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    private void writeCommonString(Parcel out, String name) {
1141be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        Integer index = mCommonStringToIndex.get(name);
1142be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (index != null) {
1143be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            out.writeInt(index);
1144be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            return;
1145be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1146be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        index = mCommonStringToIndex.size();
1147be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mCommonStringToIndex.put(name, index);
1148be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        out.writeInt(~index);
1149be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        out.writeString(name);
1150be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    }
1151be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1152be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    private String readCommonString(Parcel in, int version) {
1153be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (version <= 9) {
1154be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            return in.readString();
1155be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1156be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        int index = in.readInt();
1157be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (index >= 0) {
1158be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            return mIndexToCommonString.get(index);
1159be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1160be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        index = ~index;
1161be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        String name = in.readString();
1162be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        while (mIndexToCommonString.size() <= index) {
1163be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mIndexToCommonString.add(null);
1164be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1165be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mIndexToCommonString.set(index, name);
1166be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        return name;
1167be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    }
1168be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
116923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    @Override
117023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public int describeContents() {
117123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        return 0;
117223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    }
117323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
117423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    @Override
117523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public void writeToParcel(Parcel out, int flags) {
1176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long now = SystemClock.uptimeMillis();
1177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(MAGIC);
1178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(PARCEL_VERSION);
1179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(STATE_COUNT);
1180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(ADJ_COUNT);
1181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(PSS_COUNT);
1182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(LONGS_SIZE);
1183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1184be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.mMap.size());
1185be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
11868a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        // First commit all running times.
11878a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
11888a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        final int NPROC = procMap.size();
11898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        for (int ip=0; ip<NPROC; ip++) {
11908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
11918a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            final int NUID = uids.size();
11928a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
11938a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                uids.valueAt(iu).commitStateTime(now);
11948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
11958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        }
11968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
11978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        final int NPKG = pkgMap.size();
11988a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        for (int ip=0; ip<NPKG; ip++) {
11998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
12008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            final int NUID = uids.size();
12018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
12028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                PackageState pkgState = uids.valueAt(iu);
12038a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                final int NPROCS = pkgState.mProcesses.size();
12048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                for (int iproc=0; iproc<NPROCS; iproc++) {
12058a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    ProcessState proc = pkgState.mProcesses.valueAt(iproc);
12068a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    if (proc.mCommonProcess != proc) {
12078a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                        proc.commitStateTime(now);
12088a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    }
12098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                }
12108a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                final int NSRVS = pkgState.mServices.size();
12118a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
12128a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    pkgState.mServices.valueAt(isvc).commitStateTime(now);
12138a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                }
12148a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
12158a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        }
12168a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
1217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLong(mTimePeriodStartClock);
1218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLong(mTimePeriodStartRealtime);
1219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLong(mTimePeriodEndRealtime);
1220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeString(mRuntime);
1221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeString(mWebView);
1222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(mFlags);
1223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(mLongs.size());
1225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(mNextLong);
1226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<(mLongs.size()-1); i++) {
122753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            long[] array = mLongs.get(i);
122853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            writeCompactedLongArray(out, array, array.length);
1229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
12308a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        long[] lastLongs = mLongs.get(mLongs.size() - 1);
123153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        writeCompactedLongArray(out, lastLongs, mNextLong);
1232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mMemFactor != STATE_NOTHING) {
1234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mMemFactorDurations[mMemFactor] += now - mStartTime;
1235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
1236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
123753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        writeCompactedLongArray(out, mMemFactorDurations, mMemFactorDurations.length);
1238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(NPROC);
1240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<NPROC; ip++) {
1241be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            writeCommonString(out, procMap.keyAt(ip));
1242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
1243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int NUID = uids.size();
1244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(NUID);
1245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
1246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(uids.keyAt(iu));
1247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ProcessState proc = uids.valueAt(iu);
1248be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                writeCommonString(out, proc.mPackage);
1249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                proc.writeToParcel(out, now);
1250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1251d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1252d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(NPKG);
1253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<NPKG; ip++) {
1254be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            writeCommonString(out, pkgMap.keyAt(ip));
1255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
1256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int NUID = uids.size();
1257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(NUID);
1258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
1259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(uids.keyAt(iu));
1260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                PackageState pkgState = uids.valueAt(iu);
1261d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NPROCS = pkgState.mProcesses.size();
1262d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(NPROCS);
1263d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int iproc=0; iproc<NPROCS; iproc++) {
1264be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    writeCommonString(out, pkgState.mProcesses.keyAt(iproc));
1265d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ProcessState proc = pkgState.mProcesses.valueAt(iproc);
1266d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (proc.mCommonProcess == proc) {
1267d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // This is the same as the common process we wrote above.
1268d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        out.writeInt(0);
1269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
1270d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // There is separate data for this package's process.
1271d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        out.writeInt(1);
1272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        proc.writeToParcel(out, now);
1273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NSRVS = pkgState.mServices.size();
1276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(NSRVS);
1277d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
1278d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    out.writeString(pkgState.mServices.keyAt(isvc));
1279d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ServiceState svc = pkgState.mServices.valueAt(isvc);
1280be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    writeCommonString(out, svc.mProcessName);
1281d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    svc.writeToParcel(out, now);
1282d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1283d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1284d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1285be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1286be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mCommonStringToIndex = null;
1287d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1288d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1289d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private boolean readCheckedInt(Parcel in, int val, String what) {
1290d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int got;
1291d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((got=in.readInt()) != val) {
1292d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad " + what + ": " + got;
1293d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return false;
1294d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1295d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return true;
1296d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1297d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
129853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn    static byte[] readFully(InputStream stream, int[] outLen) throws IOException {
129960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        int pos = 0;
130053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        final int initialAvail = stream.available();
130153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384];
130260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        while (true) {
130360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int amt = stream.read(data, pos, data.length-pos);
1304164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos
130553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                    + " of avail " + data.length);
130653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            if (amt < 0) {
1307164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos
130853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                        + " len=" + data.length);
130953459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                outLen[0] = pos;
131060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                return data;
131160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
131260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            pos += amt;
131353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            if (pos >= data.length) {
131453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                byte[] newData = new byte[pos+16384];
1315164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len "
131653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                        + newData.length);
131760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                System.arraycopy(data, 0, newData, 0, pos);
131860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                data = newData;
131960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
132060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
132160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
132260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
132360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    public void read(InputStream stream) {
132460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        try {
132553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            int[] len = new int[1];
132653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            byte[] raw = readFully(stream, len);
132760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            Parcel in = Parcel.obtain();
132853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            in.unmarshall(raw, 0, len[0]);
132960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            in.setDataPosition(0);
133060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            stream.close();
133160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
133260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            readFromParcel(in);
133360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        } catch (IOException e) {
133460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mReadError = "caught exception: " + e;
133560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
133660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
133760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
1338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void readFromParcel(Parcel in) {
1339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final boolean hadData = mPackages.getMap().size() > 0
1340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                || mProcesses.getMap().size() > 0;
1341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (hadData) {
1342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            resetSafely();
1343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, MAGIC, "magic number")) {
1346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int version = in.readInt();
1349be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (version != PARCEL_VERSION) {
1350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad version: " + version;
1351d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, STATE_COUNT, "state count")) {
1354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, ADJ_COUNT, "adj count")) {
1357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1358d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, PSS_COUNT, "pss count")) {
1360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, LONGS_SIZE, "longs size")) {
1363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1366be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mIndexToCommonString = new ArrayList<String>();
1367be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartClock = in.readLong();
1369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        buildTimePeriodStartClockStr();
1370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartRealtime = in.readLong();
1371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodEndRealtime = in.readLong();
1372be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mRuntime = in.readString();
1373be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mWebView = in.readString();
1374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mFlags = in.readInt();
1375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NLONGS = in.readInt();
1377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NEXTLONG = in.readInt();
1378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.clear();
1379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<(NLONGS-1); i++) {
1380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            while (i >= mLongs.size()) {
1381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mLongs.add(new long[LONGS_SIZE]);
1382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
138353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            readCompactedLongArray(in, version, mLongs.get(i), LONGS_SIZE);
1384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = new long[LONGS_SIZE];
1386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mNextLong = NEXTLONG;
138753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        readCompactedLongArray(in, version, longs, NEXTLONG);
1388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.add(longs);
1389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
139053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        readCompactedLongArray(in, version, mMemFactorDurations, mMemFactorDurations.length);
1391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int NPROC = in.readInt();
1393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (NPROC < 0) {
1394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad process count: " + NPROC;
1395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        while (NPROC > 0) {
1398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            NPROC--;
1399be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            String procName = readCommonString(in, version);
1400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (procName == null) {
1401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad process name";
1402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int NUID = in.readInt();
1405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (NUID < 0) {
1406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad uid count: " + NUID;
1407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            while (NUID > 0) {
1410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                NUID--;
1411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = in.readInt();
1412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (uid < 0) {
1413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad uid: " + uid;
1414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1416be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                String pkgName = readCommonString(in, version);
1417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (pkgName == null) {
1418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad process package name";
1419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ProcessState proc = hadData ? mProcesses.get(procName, uid) : null;
1422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (proc != null) {
1423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!proc.readFromParcel(in, false)) {
1424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else {
1427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    proc = new ProcessState(this, pkgName, uid, procName);
1428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!proc.readFromParcel(in, true)) {
1429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1432164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid
1433164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        + " " + proc);
1434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mProcesses.put(procName, uid, proc);
1435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1438164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes");
1439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int NPKG = in.readInt();
1441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (NPKG < 0) {
1442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad package count: " + NPKG;
1443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        while (NPKG > 0) {
1446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            NPKG--;
1447be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            String pkgName = readCommonString(in, version);
1448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (pkgName == null) {
1449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad package name";
1450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int NUID = in.readInt();
1453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (NUID < 0) {
1454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad uid count: " + NUID;
1455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            while (NUID > 0) {
1458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                NUID--;
1459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = in.readInt();
1460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (uid < 0) {
1461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad uid: " + uid;
1462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1464cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                PackageState pkgState = new PackageState(pkgName, uid);
1465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mPackages.put(pkgName, uid, pkgState);
1466d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int NPROCS = in.readInt();
1467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (NPROCS < 0) {
1468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad package process count: " + NPROCS;
1469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                while (NPROCS > 0) {
1472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    NPROCS--;
1473be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    String procName = readCommonString(in, version);
1474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (procName == null) {
1475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        mReadError = "bad package process name";
1476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int hasProc = in.readInt();
1479164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid
1480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + " process " + procName + " hasProc=" + hasProc);
1481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ProcessState commonProc = mProcesses.get(procName, uid);
1482164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid
1483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + ": " + commonProc);
1484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (commonProc == null) {
1485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        mReadError = "no common proc: " + procName;
1486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (hasProc != 0) {
1489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // The process for this package is unique to the package; we
1490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // need to load it.  We don't need to do anything about it if
1491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // it is not unique because if someone later looks for it
1492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // they will find and use it from the global procs.
1493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null;
1494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (proc != null) {
1495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (!proc.readFromParcel(in, false)) {
1496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                return;
1497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
1498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        } else {
1499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            proc = new ProcessState(commonProc, pkgName, uid, procName, 0);
1500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (!proc.readFromParcel(in, true)) {
1501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                return;
1502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
1503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
1504164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: "
1505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                + procName + " " + uid + " " + proc);
1506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pkgState.mProcesses.put(procName, proc);
1507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
1508164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: "
1509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                + procName + " " + uid + " " + commonProc);
1510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pkgState.mProcesses.put(procName, commonProc);
1511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int NSRVS = in.readInt();
1514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (NSRVS < 0) {
1515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad package service count: " + NSRVS;
1516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                while (NSRVS > 0) {
1519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    NSRVS--;
1520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    String serviceName = in.readString();
1521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (serviceName == null) {
1522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        mReadError = "bad package service name";
1523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1525be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    String processName = version > 9 ? readCommonString(in, version) : null;
1526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null;
1527d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (serv == null) {
1528be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                        serv = new ServiceState(this, pkgName, serviceName, processName, null);
1529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!serv.readFromParcel(in)) {
1531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1533164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: "
1534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + serviceName + " " + uid + " " + serv);
1535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pkgState.mServices.put(serviceName, serv);
1536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1540be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mIndexToCommonString = null;
1541be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1542164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!");
1543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int addLongData(int index, int type, int num) {
1546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int tableLen = mAddLongTable != null ? mAddLongTable.length : 0;
1547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mAddLongTableSize >= tableLen) {
1548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int newSize = ArrayUtils.idealIntArraySize(tableLen + 1);
1549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] newTable = new int[newSize];
1550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (tableLen > 0) {
1551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                System.arraycopy(mAddLongTable, 0, newTable, 0, tableLen);
1552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mAddLongTable = newTable;
1554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mAddLongTableSize > 0 && mAddLongTableSize - index != 0) {
1556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            System.arraycopy(mAddLongTable, index, mAddLongTable, index + 1,
1557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mAddLongTableSize - index);
1558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int off = allocLongData(num);
1560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mAddLongTable[index] = type | off;
1561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mAddLongTableSize++;
1562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return off;
1563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int allocLongData(int num) {
1566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int whichLongs = mLongs.size()-1;
1567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = mLongs.get(whichLongs);
1568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mNextLong + num > longs.length) {
1569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            longs = new long[LONGS_SIZE];
1570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLongs.add(longs);
1571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            whichLongs++;
1572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNextLong = 0;
1573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int off = (whichLongs<<OFFSET_ARRAY_SHIFT) | (mNextLong<<OFFSET_INDEX_SHIFT);
1575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mNextLong += num;
1576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return off;
1577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    boolean validateLongOffset(int off) {
1580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int arr = (off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK;
1581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (arr >= mLongs.size()) {
1582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return false;
1583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK;
1585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (idx >= LONGS_SIZE) {
1586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return false;
1587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1588164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG_PARCEL) Slog.d(TAG, "Validated long " + printLongOffset(off)
1589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                + ": " + getLong(off, 0));
1590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return true;
1591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static String printLongOffset(int off) {
1594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        StringBuilder sb = new StringBuilder(16);
1595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        sb.append("a"); sb.append((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        sb.append("i"); sb.append((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK);
1597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        sb.append("t"); sb.append((off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK);
1598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return sb.toString();
1599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void setLong(int off, int index, long value) {
1602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)] = value;
1604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    long getLong(int off, int index) {
1607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)];
1609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int binarySearch(int[] array, int size, int value) {
1612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int lo = 0;
1613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int hi = size - 1;
1614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        while (lo <= hi) {
1616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int mid = (lo + hi) >>> 1;
1617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int midVal = (array[mid] >> OFFSET_TYPE_SHIFT) & OFFSET_TYPE_MASK;
1618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (midVal < value) {
1620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                lo = mid + 1;
1621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else if (midVal > value) {
1622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                hi = mid - 1;
1623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
1624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return mid;  // value found
1625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return ~lo;  // value not present
1628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public PackageState getPackageStateLocked(String packageName, int uid) {
1631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        PackageState as = mPackages.get(packageName, uid);
1632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (as != null) {
1633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return as;
1634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1635cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        as = new PackageState(packageName, uid);
1636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mPackages.put(packageName, uid, as);
1637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return as;
1638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public ProcessState getProcessStateLocked(String packageName, int uid, String processName) {
1641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final PackageState pkgState = getPackageStateLocked(packageName, uid);
1642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState ps = pkgState.mProcesses.get(processName);
1643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (ps != null) {
1644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return ps;
1645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState commonProc = mProcesses.get(processName, uid);
1647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (commonProc == null) {
1648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            commonProc = new ProcessState(this, packageName, uid, processName);
1649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mProcesses.put(processName, uid, commonProc);
1650164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc);
1651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!commonProc.mMultiPackage) {
1653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (packageName.equals(commonProc.mPackage)) {
1654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // This common process is not in use by multiple packages, and
1655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // is for the calling package, so we can just use it directly.
1656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ps = commonProc;
1657164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc);
1658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
1659164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!");
1660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // This common process has not been in use by multiple packages,
1661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // but it was created for a different package than the caller.
1662d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // We need to convert it to a multi-package process.
1663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                commonProc.mMultiPackage = true;
1664cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // To do this, we need to make two new process states, one a copy
1665cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // of the current state for the process under the original package
1666cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // name, and the second a free new process state for it as the
1667cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // new package name.
1668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long now = SystemClock.uptimeMillis();
1669cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // First let's make a copy of the current process state and put
1670cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // that under the now unique state for its original package name.
1671cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                final PackageState commonPkgState = getPackageStateLocked(commonProc.mPackage, uid);
1672cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (commonPkgState != null) {
1673164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    ProcessState cloned = commonProc.clone(commonProc.mPackage, now);
1674164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.mPackage
1675164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            + ": " + cloned);
1676164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    commonPkgState.mProcesses.put(commonProc.mName, cloned);
1677164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    // If this has active services, we need to update their process pointer
1678164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    // to point to the new package-specific process state.
1679164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    for (int i=commonPkgState.mServices.size()-1; i>=0; i--) {
1680164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        ServiceState ss = commonPkgState.mServices.valueAt(i);
1681164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (ss.mProc == commonProc) {
1682164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: "
1683164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + ss);
1684164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            ss.mProc = cloned;
1685164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        } else if (DEBUG) {
1686164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            Slog.d(TAG, "GETPROC leaving proc of " + ss);
1687164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
1688164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
1689cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                } else {
1690cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    Slog.w(TAG, "Cloning proc state: no package state " + commonProc.mPackage
1691cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                            + "/" + uid + " for proc " + commonProc.mName);
1692cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
1693cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // And now make a fresh new process state for the new package name.
1694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ps = new ProcessState(commonProc, packageName, uid, processName, now);
1695164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
1696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
1698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // The common process is for multiple packages, we need to create a
1699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // separate object for the per-package data.
1700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ps = new ProcessState(commonProc, packageName, uid, processName,
1701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    SystemClock.uptimeMillis());
1702164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
1703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pkgState.mProcesses.put(processName, ps);
1705164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps);
1706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return ps;
1707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
170960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    public ProcessStats.ServiceState getServiceStateLocked(String packageName, int uid,
171060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            String processName, String className) {
171160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid);
171260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        ProcessStats.ServiceState ss = as.mServices.get(className);
171360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        if (ss != null) {
1714164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss);
171560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            return ss;
171660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
171760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        final ProcessStats.ProcessState ps = processName != null
171860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                ? getProcessStateLocked(packageName, uid, processName) : null;
1719be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        ss = new ProcessStats.ServiceState(this, packageName, className, processName, ps);
172060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        as.mServices.put(className, ss);
1721164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps);
172260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        return ss;
172360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
172460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
1725cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    private void dumpProcessInternalLocked(PrintWriter pw, String prefix, ProcessState proc,
1726cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            boolean dumpAll) {
1727cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        if (dumpAll) {
1728cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            pw.print(prefix); pw.print("myID=");
1729cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    pw.print(Integer.toHexString(System.identityHashCode(proc)));
1730cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    pw.print(" mCommonProcess=");
1731cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    pw.print(Integer.toHexString(System.identityHashCode(proc.mCommonProcess)));
1732cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    pw.print(" mPackage="); pw.println(proc.mPackage);
1733cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (proc.mMultiPackage) {
1734cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                pw.print(prefix); pw.print("mMultiPackage="); pw.println(proc.mMultiPackage);
1735cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
1736cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (proc != proc.mCommonProcess) {
1737cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                pw.print(prefix); pw.print("Common Proc: "); pw.print(proc.mCommonProcess.mName);
1738cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        pw.print("/"); pw.print(proc.mCommonProcess.mUid);
1739cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        pw.print(" pkg="); pw.println(proc.mCommonProcess.mPackage);
1740cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
1741cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
1742237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn        if (proc.mActive) {
1743237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print(prefix); pw.print("mActive="); pw.println(proc.mActive);
1744237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn        }
1745cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        if (proc.mDead) {
1746cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            pw.print(prefix); pw.print("mDead="); pw.println(proc.mDead);
1747cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
1748237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn        if (proc.mNumActiveServices != 0 || proc.mNumStartedServices != 0) {
1749237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print(prefix); pw.print("mNumActiveServices="); pw.print(proc.mNumActiveServices);
1750237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    pw.print(" mNumStartedServices=");
1751237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    pw.println(proc.mNumStartedServices);
1752237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn        }
1753cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    }
1754cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
175553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn    public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary,
1756164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            boolean dumpAll, boolean activeOnly) {
1757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
1758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartTime, now);
1759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
1760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean printedHeader = false;
1761daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        boolean sepNeeded = false;
1762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
1763daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            final String pkgName = pkgMap.keyAt(ip);
1764daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            final SparseArray<PackageState> uids = pkgMap.valueAt(ip);
1765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
1766daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                final int uid = uids.keyAt(iu);
1767daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                final PackageState pkgState = uids.valueAt(iu);
1768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NPROCS = pkgState.mProcesses.size();
1769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NSRVS = pkgState.mServices.size();
1770daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName);
1771daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (!pkgMatch) {
1772daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    boolean procMatch = false;
1773daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
1774daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        ProcessState proc = pkgState.mProcesses.valueAt(iproc);
1775daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        if (reqPackage.equals(proc.mName)) {
1776daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                            procMatch = true;
1777daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                            break;
1778daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        }
1779daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    }
1780daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    if (!procMatch) {
1781daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        continue;
1782daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    }
1783daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
1784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (NPROCS > 0 || NSRVS > 0) {
1785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!printedHeader) {
1786ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn                        pw.println("Per-Package Stats:");
1787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedHeader = true;
1788daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        sepNeeded = true;
1789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("  * "); pw.print(pkgName); pw.print(" / ");
1791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            UserHandle.formatUid(pw, uid); pw.println(":");
1792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
179353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                if (!dumpSummary || dumpAll) {
1794d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
1795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        ProcessState proc = pkgState.mProcesses.valueAt(iproc);
1796daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        if (!pkgMatch && !reqPackage.equals(proc.mName)) {
1797daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                            continue;
1798daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        }
1799164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (activeOnly && !proc.isInUse()) {
1800164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            pw.print("      (Not active: ");
1801164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")");
1802164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            continue;
1803164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
1804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("      Process ");
1805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(pkgState.mProcesses.keyAt(iproc));
1806daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        if (proc.mCommonProcess.mMultiPackage) {
1807daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                            pw.print(" (multi, ");
1808daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        } else {
1809daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                            pw.print(" (unique, ");
1810daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        }
1811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(proc.mDurationsTableSize);
1812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" entries)");
1813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println(":");
1814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        dumpProcessState(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ALL_PROC_STATES, now);
1816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        dumpProcessPss(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ALL_PROC_STATES);
1818cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        dumpProcessInternalLocked(pw, "        ", proc, dumpAll);
1819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else {
1821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ArrayList<ProcessState> procs = new ArrayList<ProcessState>();
1822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
1823164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        ProcessState proc = pkgState.mProcesses.valueAt(iproc);
1824daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        if (!pkgMatch && !reqPackage.equals(proc.mName)) {
1825daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                            continue;
1826daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        }
1827164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (activeOnly && !proc.isInUse()) {
1828164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            continue;
1829164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
1830164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        procs.add(proc);
1831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpProcessSummaryLocked(pw, "      ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            NON_CACHED_PROC_STATES, now, totalTime);
1834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
1836164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    ServiceState svc = pkgState.mServices.valueAt(isvc);
1837daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    if (!pkgMatch && !reqPackage.equals(svc.mProcessName)) {
1838daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        continue;
1839daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    }
1840164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (activeOnly && !svc.isInUse()) {
1841164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        pw.print("      (Not active: ");
1842164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")");
1843164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        continue;
1844164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
1845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (dumpAll) {
1846d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("      Service ");
1847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
1848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("      * ");
1849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(pkgState.mServices.keyAt(isvc));
1851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println(":");
1852cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    pw.print("        Process: "); pw.println(svc.mProcessName);
1853be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    dumpServiceStats(pw, "        ", "          ", "    ", "Running", svc,
1854be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                            svc.mRunCount, ServiceState.SERVICE_RUN, svc.mRunState,
185553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                            svc.mRunStartTime, now, totalTime, !dumpSummary || dumpAll);
1856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceStats(pw, "        ", "          ", "    ", "Started", svc,
1857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mStartedCount, ServiceState.SERVICE_STARTED, svc.mStartedState,
185853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                            svc.mStartedStartTime, now, totalTime, !dumpSummary || dumpAll);
1859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceStats(pw, "        ", "          ", "      ", "Bound", svc,
1860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mBoundCount, ServiceState.SERVICE_BOUND, svc.mBoundState,
186153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                            svc.mBoundStartTime, now, totalTime, !dumpSummary || dumpAll);
1862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceStats(pw, "        ", "          ", "  ", "Executing", svc,
1863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState,
186453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                            svc.mExecStartTime, now, totalTime, !dumpSummary || dumpAll);
1865be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    if (dumpAll) {
1866164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (svc.mOwner != null) {
1867164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            pw.print("        mOwner="); pw.println(svc.mOwner);
1868164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
1869daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        if (svc.mStarted || svc.mRestarting) {
1870daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                            pw.print("        mStarted="); pw.print(svc.mStarted);
1871daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                            pw.print(" mRestarting="); pw.println(svc.mRestarting);
1872daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        }
1873be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    }
1874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1878daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
1879daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        printedHeader = false;
1880daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        int numShownProcs = 0, numTotalProcs = 0;
1881daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        for (int ip=0; ip<procMap.size(); ip++) {
1882daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            String procName = procMap.keyAt(ip);
1883daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
1884daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
1885daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                int uid = uids.keyAt(iu);
1886daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                numTotalProcs++;
1887daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                ProcessState proc = uids.valueAt(iu);
1888daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (proc.mDurationsTableSize == 0 && proc.mCurState == STATE_NOTHING
1889daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        && proc.mPssTableSize == 0) {
1890daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    continue;
1891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1892daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (!proc.mMultiPackage) {
1893daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    continue;
1894daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
1895daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (reqPackage != null && !reqPackage.equals(procName)
1896daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        && !reqPackage.equals(proc.mPackage)) {
1897daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    continue;
1898daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
1899daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                numShownProcs++;
1900daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (sepNeeded) {
1901daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    pw.println();
1902daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
1903daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                sepNeeded = true;
1904daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (!printedHeader) {
1905daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    pw.println("Multi-Package Common Processes:");
1906daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    printedHeader = true;
1907daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
1908daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (activeOnly && !proc.isInUse()) {
1909daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    pw.print("      (Not active: "); pw.print(procName); pw.println(")");
1910daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    continue;
1911daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
1912daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                pw.print("  * "); pw.print(procName); pw.print(" / ");
1913daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        UserHandle.formatUid(pw, uid);
1914daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        pw.print(" ("); pw.print(proc.mDurationsTableSize);
1915daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        pw.print(" entries)"); pw.println(":");
1916daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                dumpProcessState(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1917daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        ALL_PROC_STATES, now);
1918daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                dumpProcessPss(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1919daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        ALL_PROC_STATES);
1920daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                dumpProcessInternalLocked(pw, "        ", proc, dumpAll);
1921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1922daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
1923daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        if (dumpAll) {
1924daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            pw.println();
1925daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            pw.print("  Total procs: "); pw.print(numShownProcs);
1926daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total");
1927daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
1928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1929daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        if (sepNeeded) {
1930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
1931daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
1932daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        if (dumpSummary) {
1933daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            pw.println("Summary:");
1934daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            dumpSummaryLocked(pw, reqPackage, now, activeOnly);
1935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
1936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpTotalsLocked(pw, now);
1937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (dumpAll) {
1940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
1941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println("Internal state:");
1942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("  Num long arrays: "); pw.println(mLongs.size());
1943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("  Next long entry: "); pw.println(mNextLong);
1944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("  mRunning="); pw.println(mRunning);
1945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
194869cb00b8dda60eff7449b69723f4e73a28e944f8Dianne Hackborn    public static long dumpSingleServiceTime(PrintWriter pw, String prefix, ServiceState service,
1949d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int serviceType, int curState, long curStartTime, long now) {
1950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
1951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
1952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
1953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
1954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
1955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int state = imem+iscreen;
1956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long time = service.getDuration(serviceType, curState, curStartTime,
1957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        state, now);
1958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                String running = "";
19598a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                if (curState == state && pw != null) {
19608a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    running = " (running)";
1961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (time != 0) {
1963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (pw != null) {
1964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
1965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printScreenLabel(pw, printedScreen != iscreen
1966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ? iscreen : STATE_NOTHING);
1967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedScreen = iscreen;
1968237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0);
1969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedMem = imem;
1970237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        pw.print(": ");
1971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        TimeUtils.formatDuration(time, pw); pw.println(running);
1972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    totalTime += time;
1974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totalTime != 0 && pw != null) {
1978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
1979237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print("    TOTAL: ");
1980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            TimeUtils.formatDuration(totalTime, pw);
1981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
1982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return totalTime;
1984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void dumpServiceStats(PrintWriter pw, String prefix, String prefixInner,
1987d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String headerPrefix, String header, ServiceState service,
1988d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int count, int serviceType, int state, long startTime, long now, long totalTime,
1989d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean dumpAll) {
1990d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (count != 0) {
1991d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (dumpAll) {
1992d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(prefix); pw.print(header);
1993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" op count "); pw.print(count); pw.println(":");
1994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                dumpSingleServiceTime(pw, prefixInner, service, serviceType, state, startTime,
1995d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        now);
1996d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
1997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long myTime = dumpSingleServiceTime(null, null, service, serviceType, state,
1998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        startTime, now);
1999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(prefix); pw.print(headerPrefix); pw.print(header);
2000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" count "); pw.print(count);
2001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" / time ");
2002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printPercent(pw, (double)myTime/(double)totalTime);
2003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println();
2004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2005d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2008164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn    public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) {
2009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
2010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartTime, now);
2011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpFilteredSummaryLocked(pw, null, "  ", ALL_SCREEN_ADJ, ALL_MEM_ADJ,
2012164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly);
2013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpTotalsLocked(pw, now);
2015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void dumpTotalsLocked(PrintWriter pw, long now) {
2018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println("Run time Stats:");
2019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpSingleTime(pw, "  ", mMemFactorDurations, mMemFactor, mStartTime, now);
2020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("          Start time: ");
2022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock));
2023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("  Total elapsed time: ");
2025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        TimeUtils.formatDuration(
2026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime)
2027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        - mTimePeriodStartRealtime, pw);
2028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean partial = true;
2029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SHUTDOWN) != 0) {
2030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (shutdown)");
2031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SYSPROPS) != 0) {
2034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (sysprops)");
2035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_COMPLETE) != 0) {
2038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (complete)");
2039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (partial) {
2042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (partial)");
2043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(' ');
2045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(mRuntime);
2046d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(' ');
2047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(mWebView);
2048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2051d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix,
2052cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            int[] screenStates, int[] memStates, int[] procStates,
2053164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) {
2054d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates,
2055164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                procStates, sortProcStates, now, reqPackage, activeOnly);
2056d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (procs.size() > 0) {
2057d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (header != null) {
2058d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println();
2059d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println(header);
2060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2061cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates,
2062cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    sortProcStates, now, totalTime);
2063d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2066d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates,
2067164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            int[] procStates, int sortProcStates[], long now, String reqPackage,
2068164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            boolean activeOnly) {
2069daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>();
2070daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        final ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
2071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
2072daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            final String pkgName = pkgMap.keyAt(ip);
2073daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            final SparseArray<PackageState> procs = pkgMap.valueAt(ip);
2074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<procs.size(); iu++) {
2075daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                final PackageState state = procs.valueAt(iu);
2076daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                final int NPROCS = state.mProcesses.size();
2077daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName);
2078daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                for (int iproc=0; iproc<NPROCS; iproc++) {
2079daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    final ProcessState proc = state.mProcesses.valueAt(iproc);
2080daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    if (!pkgMatch && !reqPackage.equals(proc.mName)) {
2081daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        continue;
2082daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    }
2083164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (activeOnly && !proc.isInUse()) {
2084164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        continue;
2085164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
2086d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    foundProcs.add(proc.mCommonProcess);
2087d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2088d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2089d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2090d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size());
2091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<foundProcs.size(); i++) {
2092d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = foundProcs.valueAt(i);
2093164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (computeProcessTimeLocked(proc, screenStates, memStates, procStates, now) > 0) {
2094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                outProcs.add(proc);
2095cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (procStates != sortProcStates) {
2096cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    computeProcessTimeLocked(proc, screenStates, memStates, sortProcStates, now);
2097cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
2098d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2099d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2100d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        Collections.sort(outProcs, new Comparator<ProcessState>() {
2101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            @Override
2102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            public int compare(ProcessState lhs, ProcessState rhs) {
2103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) {
2104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return -1;
2105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) {
2106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return 1;
2107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return 0;
2109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        });
2111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return outProcs;
2112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    String collapseString(String pkgName, String itemName) {
2115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (itemName.startsWith(pkgName)) {
2116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int ITEMLEN = itemName.length();
2117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int PKGLEN = pkgName.length();
2118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (ITEMLEN == PKGLEN) {
2119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return "";
2120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else if (ITEMLEN >= PKGLEN) {
2121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (itemName.charAt(PKGLEN) == '.') {
2122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return itemName.substring(PKGLEN);
2123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return itemName;
2127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void dumpCheckinLocked(PrintWriter pw, String reqPackage) {
2130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final long now = SystemClock.uptimeMillis();
2131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
2132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println("vers,3");
2133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("period,"); pw.print(mTimePeriodStartClockStr);
2134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(",");
2135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime);
2136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean partial = true;
2137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SHUTDOWN) != 0) {
2138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",shutdown");
2139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SYSPROPS) != 0) {
2142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",sysprops");
2143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_COMPLETE) != 0) {
2146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",complete");
2147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (partial) {
2150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",partial");
2151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("config,"); pw.print(mRuntime); pw.print(','); pw.println(mWebView);
2154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
2155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String pkgName = pkgMap.keyAt(ip);
2156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (reqPackage != null && !reqPackage.equals(pkgName)) {
2157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                continue;
2158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
2160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
2161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = uids.keyAt(iu);
2162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                PackageState pkgState = uids.valueAt(iu);
2163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NPROCS = pkgState.mProcesses.size();
2164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NSRVS = pkgState.mServices.size();
2165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int iproc=0; iproc<NPROCS; iproc++) {
2166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ProcessState proc = pkgState.mProcesses.valueAt(iproc);
2167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("pkgproc,");
2168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(pkgName);
2169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
2171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
2173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpAllProcessStateCheckin(pw, proc, now);
2174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
2175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (proc.mPssTableSize > 0) {
2176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("pkgpss,");
2177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(pkgName);
2178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
2179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(uid);
2180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
2181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
2182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        dumpAllProcessPssCheckin(pw, proc);
2183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println();
2184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
21853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0
21863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                            || proc.mNumCachedKill > 0) {
2187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("pkgkills,");
2188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(pkgName);
2189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
2190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(uid);
2191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
2192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
2193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
2194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(proc.mNumExcessiveWake);
2195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
2196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(proc.mNumExcessiveCpu);
21973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        pw.print(",");
21983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        pw.print(proc.mNumCachedKill);
21993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        pw.print(",");
22003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        pw.print(proc.mMinCachedKillPss);
22013bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        pw.print(":");
22023bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        pw.print(proc.mAvgCachedKillPss);
22033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        pw.print(":");
22043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        pw.print(proc.mMaxCachedKillPss);
2205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println();
2206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
2207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
2209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    String serviceName = collapseString(pkgName,
2210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pkgState.mServices.keyAt(isvc));
2211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ServiceState svc = pkgState.mServices.valueAt(isvc);
2212be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    dumpServiceTimeCheckin(pw, "pkgsvc-run", pkgName, uid, serviceName,
2213be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                            svc, ServiceState.SERVICE_RUN, svc.mRunCount,
2214be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                            svc.mRunState, svc.mRunStartTime, now);
2215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceTimeCheckin(pw, "pkgsvc-start", pkgName, uid, serviceName,
2216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc, ServiceState.SERVICE_STARTED, svc.mStartedCount,
2217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mStartedState, svc.mStartedStartTime, now);
2218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceTimeCheckin(pw, "pkgsvc-bound", pkgName, uid, serviceName,
2219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc, ServiceState.SERVICE_BOUND, svc.mBoundCount,
2220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mBoundState, svc.mBoundStartTime, now);
2221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceTimeCheckin(pw, "pkgsvc-exec", pkgName, uid, serviceName,
2222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc, ServiceState.SERVICE_EXEC, svc.mExecCount,
2223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mExecState, svc.mExecStartTime, now);
2224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
2229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<procMap.size(); ip++) {
2230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String procName = procMap.keyAt(ip);
2231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
2232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
2233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = uids.keyAt(iu);
2234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ProcessState procState = uids.valueAt(iu);
2235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (procState.mDurationsTableSize > 0) {
2236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("proc,");
2237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procName);
2238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
2240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpAllProcessStateCheckin(pw, procState, now);
2241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
2242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (procState.mPssTableSize > 0) {
2244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("pss,");
2245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procName);
2246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
2248d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpAllProcessPssCheckin(pw, procState);
2249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
2250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
22513bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0
22523bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        || procState.mNumCachedKill > 0) {
2253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("kills,");
2254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procName);
2255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
2257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procState.mNumExcessiveWake);
2259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procState.mNumExcessiveCpu);
22613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(",");
22623bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(procState.mNumCachedKill);
22633bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(",");
22643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(procState.mMinCachedKillPss);
22653bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(":");
22663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(procState.mAvgCachedKillPss);
22673bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(":");
22683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(procState.mMaxCachedKillPss);
2269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
2270d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2271d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("total");
2274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor,
2275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartTime, now);
2276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2277d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2278d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2279cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    public static class DurationsTable {
22808a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final ProcessStats mStats;
2281cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public final String mName;
2282cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public int[] mDurationsTable;
2283cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public int mDurationsTableSize;
2284cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2285cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public DurationsTable(ProcessStats stats, String name) {
2286cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mStats = stats;
2287cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mName = name;
2288cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2289cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2290cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void copyDurationsTo(DurationsTable other) {
2291cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (mDurationsTable != null) {
2292cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mStats.mAddLongTable = new int[mDurationsTable.length];
2293cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mStats.mAddLongTableSize = 0;
2294cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                for (int i=0; i<mDurationsTableSize; i++) {
2295cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    int origEnt = mDurationsTable[i];
2296cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
2297cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    int newOff = mStats.addLongData(i, type, 1);
2298cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    mStats.mAddLongTable[i] = newOff | type;
2299cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    mStats.setLong(newOff, 0, mStats.getLong(origEnt, 0));
2300cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
2301cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                other.mDurationsTable = mStats.mAddLongTable;
2302cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                other.mDurationsTableSize = mStats.mAddLongTableSize;
2303cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            } else {
2304cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                other.mDurationsTable = null;
2305cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                other.mDurationsTableSize = 0;
2306cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2307cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2308cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2309cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void addDurations(DurationsTable other) {
2310cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            for (int i=0; i<other.mDurationsTableSize; i++) {
2311cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                int ent = other.mDurationsTable[i];
2312cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
2313cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (DEBUG) Slog.d(TAG, "Adding state " + state + " duration "
2314cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        + other.mStats.getLong(ent, 0));
2315cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(state, other.mStats.getLong(ent, 0));
2316cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2317cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2318cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2319cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void resetDurationsSafely() {
2320cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mDurationsTable = null;
2321cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mDurationsTableSize = 0;
2322cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2323cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2324cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void writeDurationsToParcel(Parcel out) {
2325cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            out.writeInt(mDurationsTableSize);
2326cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            for (int i=0; i<mDurationsTableSize; i++) {
2327164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": "
2328cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        + printLongOffset(mDurationsTable[i]));
2329cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                out.writeInt(mDurationsTable[i]);
2330cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2331cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2332cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2333cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        boolean readDurationsFromParcel(Parcel in) {
2334cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mDurationsTable = mStats.readTableFromParcel(in, mName, "durations");
2335cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (mDurationsTable == BAD_TABLE) {
2336cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                return false;
2337cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2338cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0;
2339cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            return true;
2340cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2341cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2342cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void addDuration(int state, long dur) {
2343cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
2344cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            int off;
2345cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (idx >= 0) {
2346cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                off = mDurationsTable[idx];
2347cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            } else {
2348cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mStats.mAddLongTable = mDurationsTable;
2349cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mStats.mAddLongTableSize = mDurationsTableSize;
2350cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                off = mStats.addLongData(~idx, state, 1);
2351cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mDurationsTable = mStats.mAddLongTable;
2352cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mDurationsTableSize = mStats.mAddLongTableSize;
2353cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2354cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
2355cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (DEBUG) Slog.d(TAG, "Duration of " + mName + " state " + state + " inc by " + dur
2356cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    + " from " + longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK]);
2357cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += dur;
2358cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2359cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2360cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        long getDuration(int state, long now) {
2361cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
2362cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            return idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0;
2363cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2364cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    }
2365cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2366cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    public static final class ProcessState extends DurationsTable {
23678a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final ProcessState mCommonProcess;
23688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final String mPackage;
23698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final int mUid;
2370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        //final long[] mDurations = new long[STATE_COUNT*ADJ_COUNT];
2372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mCurState = STATE_NOTHING;
2373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mStartTime;
2374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mLastPssState = STATE_NOTHING;
2376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mLastPssTime;
2377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int[] mPssTable;
2378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mPssTableSize;
2379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2380be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        boolean mActive;
2381be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        int mNumActiveServices;
2382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mNumStartedServices;
2383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mNumExcessiveWake;
2385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mNumExcessiveCpu;
2386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
23873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        int mNumCachedKill;
23883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        long mMinCachedKillPss;
23893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        long mAvgCachedKillPss;
23903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        long mMaxCachedKillPss;
23913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
2392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean mMultiPackage;
239350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        boolean mDead;
2394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
23958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long mTmpTotalTime;
2396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /**
2398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * Create a new top-level process state, for the initial case where there is only
2399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * a single package running in a process.  The initial state is not running.
2400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         */
2401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public ProcessState(ProcessStats processStats, String pkg, int uid, String name) {
2402cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            super(processStats, name);
2403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess = this;
2404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPackage = pkg;
2405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mUid = uid;
2406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /**
2409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * Create a new per-package process state for an existing top-level process
2410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * state.  The current running state of the top-level process is also copied,
2411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * marked as started running at 'now'.
2412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         */
2413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public ProcessState(ProcessState commonProcess, String pkg, int uid, String name,
2414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long now) {
2415cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            super(commonProcess.mStats, name);
2416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess = commonProcess;
2417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPackage = pkg;
2418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mUid = uid;
2419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCurState = commonProcess.mCurState;
2420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
2421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState clone(String pkg, long now) {
2424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState pnew = new ProcessState(this, pkg, mUid, mName, now);
2425cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            copyDurationsTo(pnew);
2426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mPssTable != null) {
24278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStats.mAddLongTable = new int[mPssTable.length];
24288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStats.mAddLongTableSize = 0;
2429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int i=0; i<mPssTableSize; i++) {
2430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int origEnt = mPssTable[i];
2431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
24328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    int newOff = mStats.addLongData(i, type, PSS_COUNT);
24338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    mStats.mAddLongTable[i] = newOff | type;
2434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int j=0; j<PSS_COUNT; j++) {
24358a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                        mStats.setLong(newOff, j, mStats.getLong(origEnt, j));
2436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
2437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
24388a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                pnew.mPssTable = mStats.mAddLongTable;
24398a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                pnew.mPssTableSize = mStats.mAddLongTableSize;
2440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pnew.mNumExcessiveWake = mNumExcessiveWake;
2442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pnew.mNumExcessiveCpu = mNumExcessiveCpu;
24433bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pnew.mNumCachedKill = mNumCachedKill;
24443bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pnew.mMinCachedKillPss = mMinCachedKillPss;
24453bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pnew.mAvgCachedKillPss = mAvgCachedKillPss;
24463bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pnew.mMaxCachedKillPss = mMaxCachedKillPss;
2447be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            pnew.mActive = mActive;
2448164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            pnew.mNumActiveServices = mNumActiveServices;
2449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pnew.mNumStartedServices = mNumStartedServices;
2450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return pnew;
2451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
245360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void add(ProcessState other) {
2454cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            addDurations(other);
245560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int i=0; i<other.mPssTableSize; i++) {
245660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int ent = other.mPssTable[i];
245760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
245860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                addPss(state, (int) other.mStats.getLong(ent, PSS_SAMPLE_COUNT),
245960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_MINIMUM),
246060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_AVERAGE),
246160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_MAXIMUM),
246260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_USS_MINIMUM),
246360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_USS_AVERAGE),
246460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_USS_MAXIMUM));
246560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
246660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mNumExcessiveWake += other.mNumExcessiveWake;
246760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mNumExcessiveCpu += other.mNumExcessiveCpu;
24683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (other.mNumCachedKill > 0) {
24693bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss,
24703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        other.mAvgCachedKillPss, other.mMaxCachedKillPss);
24713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
247260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
247360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
2474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void resetSafely(long now) {
2475cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            resetDurationsSafely();
2476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
2477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssState = STATE_NOTHING;
2478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssTime = 0;
2479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPssTable = null;
2480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPssTableSize = 0;
2481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveWake = 0;
2482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveCpu = 0;
24833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            mNumCachedKill = 0;
24843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
2485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
248750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        void makeDead() {
248850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            mDead = true;
248950ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        }
249050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn
249150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        private void ensureNotDead() {
249250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            if (!mDead) {
249350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                return;
249450ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            }
2495164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            Slog.wtfStack(TAG, "ProcessState dead: name=" + mName
249650ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                    + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName);
249750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        }
249850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn
2499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void writeToParcel(Parcel out, long now) {
2500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mMultiPackage ? 1 : 0);
2501cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            writeDurationsToParcel(out);
2502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mPssTableSize);
2503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int i=0; i<mPssTableSize; i++) {
2504164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": "
2505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + printLongOffset(mPssTable[i]));
2506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(mPssTable[i]);
2507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mNumExcessiveWake);
2509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mNumExcessiveCpu);
25103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            out.writeInt(mNumCachedKill);
25113bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (mNumCachedKill > 0) {
25123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                out.writeLong(mMinCachedKillPss);
25133bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                out.writeLong(mAvgCachedKillPss);
25143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                out.writeLong(mMaxCachedKillPss);
25153bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
2516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean readFromParcel(Parcel in, boolean fully) {
2519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean multiPackage = in.readInt() != 0;
2520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (fully) {
2521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mMultiPackage = multiPackage;
2522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2523164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table...");
2524cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (!readDurationsFromParcel(in)) {
2525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return false;
2526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2527164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table...");
25288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            mPssTable = mStats.readTableFromParcel(in, mName, "pss");
2529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mPssTable == BAD_TABLE) {
2530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return false;
2531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPssTableSize = mPssTable != null ? mPssTable.length : 0;
2533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveWake = in.readInt();
2534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveCpu = in.readInt();
25353bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            mNumCachedKill = in.readInt();
25363bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (mNumCachedKill > 0) {
25373bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMinCachedKillPss = in.readLong();
25383bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mAvgCachedKillPss = in.readLong();
25393bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMaxCachedKillPss = in.readLong();
25403bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            } else {
25413bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
25423bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
2543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return true;
2544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2546be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public void makeActive() {
254750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
2548be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mActive = true;
2549be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
2550be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
2551be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public void makeInactive() {
2552be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mActive = false;
2553be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
2554be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
2555be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public boolean isInUse() {
255650ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            return mActive || mNumActiveServices > 0 || mNumStartedServices > 0
255750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                    || mCurState != STATE_NOTHING;
2558be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
2559be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
2560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /**
2561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * Update the current state of the given list of processes.
2562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         *
2563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param state Current ActivityManager.PROCESS_STATE_*
2564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param memFactor Current mem factor constant.
2565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param now Current time.
2566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param pkgList Processes to update.
2567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         */
2568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setState(int state, int memFactor, long now,
2569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ArrayMap<String, ProcessState> pkgList) {
2570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (state < 0) {
2571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                state = mNumStartedServices > 0
2572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING;
2573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
2574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT);
2575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // First update the common process.
2578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess.setState(state, now);
2579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // If the common process is not multi-package, there is nothing else to do.
2581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
2582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
2583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (pkgList != null) {
2586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=pkgList.size()-1; ip>=0; ip--) {
2587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pullFixedProc(pkgList, ip).setState(state, now);
2588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void setState(int state, long now) {
259350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
2594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState != state) {
2595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state);
2596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                commitStateTime(now);
2597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mCurState = state;
2598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void commitStateTime(long now) {
2602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState != STATE_NOTHING) {
2603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long dur = now - mStartTime;
2604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (dur > 0) {
260560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    addDuration(mCurState, dur);
2606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
2609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2611164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        void incActiveServices(String serviceName) {
2612164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG && "".equals(mName)) {
2613164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                RuntimeException here = new RuntimeException("here");
2614164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                here.fillInStackTrace();
2615164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName
2616164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        + " to " + (mNumActiveServices+1), here);
2617164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            }
2618be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mCommonProcess != this) {
2619164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mCommonProcess.incActiveServices(serviceName);
2620be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
2621be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mNumActiveServices++;
2622be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
2623be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
2624164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        void decActiveServices(String serviceName) {
2625164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG && "".equals(mName)) {
2626164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                RuntimeException here = new RuntimeException("here");
2627164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                here.fillInStackTrace();
2628164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName
2629164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        + " to " + (mNumActiveServices-1), here);
2630164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            }
2631be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mCommonProcess != this) {
2632164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mCommonProcess.decActiveServices(serviceName);
2633be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
2634be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mNumActiveServices--;
2635be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mNumActiveServices < 0) {
2636164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage
2637164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        + " uid=" + mUid + " proc=" + mName + " service=" + serviceName);
2638164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mNumActiveServices = 0;
2639be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
2640be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
2641be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
2642daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        void incStartedServices(int memFactor, long now, String serviceName) {
2643daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            if (false) {
2644daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                RuntimeException here = new RuntimeException("here");
2645daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                here.fillInStackTrace();
2646daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                Slog.d(TAG, "incStartedServices: " + this + " service=" + serviceName
2647daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        + " to " + (mNumStartedServices+1), here);
2648daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            }
2649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCommonProcess != this) {
2650daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                mCommonProcess.incStartedServices(memFactor, now, serviceName);
2651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumStartedServices++;
2653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) {
2654daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                setState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now);
2655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2658daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        void decStartedServices(int memFactor, long now, String serviceName) {
2659daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            if (false) {
2660daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                RuntimeException here = new RuntimeException("here");
2661daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                here.fillInStackTrace();
2662daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName
2663daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        + " to " + (mNumStartedServices-1), here);
2664daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            }
2665d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCommonProcess != this) {
2666daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                mCommonProcess.decStartedServices(memFactor, now, serviceName);
2667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumStartedServices--;
2669daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            if (mNumStartedServices == 0 && (mCurState%STATE_COUNT) == STATE_SERVICE_RESTARTING) {
2670daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                setState(STATE_NOTHING, now);
2671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else if (mNumStartedServices < 0) {
2672164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtfStack(TAG, "Proc started services underrun: pkg="
2673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + mPackage + " uid=" + mUid + " name=" + mName);
2674164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mNumStartedServices = 0;
2675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2678cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public void addPss(long pss, long uss, boolean always,
2679cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                ArrayMap<String, ProcessState> pkgList) {
268050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
2681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!always) {
2682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mLastPssState == mCurState && SystemClock.uptimeMillis()
2683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        < (mLastPssTime+(30*1000))) {
2684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
2685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssState = mCurState;
2688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssTime = SystemClock.uptimeMillis();
2689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState != STATE_NOTHING) {
2690cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // First update the common process.
2691cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mCommonProcess.addPss(mCurState, 1, pss, pss, pss, uss, uss, uss);
2692cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2693cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // If the common process is not multi-package, there is nothing else to do.
2694cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (!mCommonProcess.mMultiPackage) {
2695cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    return;
2696cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
2697cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2698cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (pkgList != null) {
2699cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    for (int ip=pkgList.size()-1; ip>=0; ip--) {
2700cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        pullFixedProc(pkgList, ip).addPss(mCurState, 1,
2701cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                                pss, pss, pss, uss, uss, uss);
2702cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    }
2703cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
270460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
270560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
270660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
270760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void addPss(int state, int inCount, long minPss, long avgPss, long maxPss, long minUss,
270860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                long avgUss, long maxUss) {
270960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
271060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int off;
271160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (idx >= 0) {
271260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                off = mPssTable[idx];
271360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            } else {
271460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mStats.mAddLongTable = mPssTable;
271560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mStats.mAddLongTableSize = mPssTableSize;
271660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                off = mStats.addLongData(~idx, state, PSS_COUNT);
271760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mPssTable = mStats.mAddLongTable;
271860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mPssTableSize = mStats.mAddLongTableSize;
271960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
272060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
272160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK;
272260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            long count = longs[idx+PSS_SAMPLE_COUNT];
272360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (count == 0) {
272460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_SAMPLE_COUNT] = inCount;
272560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_MINIMUM] = minPss;
272660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_AVERAGE] = avgPss;
272760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_MAXIMUM] = maxPss;
272860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_MINIMUM] = minUss;
272960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_AVERAGE] = avgUss;
273060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_MAXIMUM] = maxUss;
273160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            } else {
273260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_SAMPLE_COUNT] = count+inCount;
273360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_MINIMUM] > minPss) {
273460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_MINIMUM] = minPss;
2735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
273660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_AVERAGE] = (long)(
273760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        ((longs[idx+PSS_AVERAGE]*(double)count)+(avgPss*(double)inCount))
273860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                / (count+inCount) );
273960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_MAXIMUM] < maxPss) {
274060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_MAXIMUM] = maxPss;
274160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
274260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_USS_MINIMUM] > minUss) {
274360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_USS_MINIMUM] = minUss;
274460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
274560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_AVERAGE] = (long)(
274660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        ((longs[idx+PSS_USS_AVERAGE]*(double)count)+(avgUss*(double)inCount))
274760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                / (count+inCount) );
274860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_USS_MAXIMUM] < maxUss) {
274960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_USS_MAXIMUM] = maxUss;
2750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2751d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void reportExcessiveWake(ArrayMap<String, ProcessState> pkgList) {
275550ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
2756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess.mNumExcessiveWake++;
2757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
2758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
2759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ip=pkgList.size()-1; ip>=0; ip--) {
2762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pullFixedProc(pkgList, ip).mNumExcessiveWake++;
2763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void reportExcessiveCpu(ArrayMap<String, ProcessState> pkgList) {
276750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
2768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess.mNumExcessiveCpu++;
2769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
2770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
2771d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ip=pkgList.size()-1; ip>=0; ip--) {
2774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pullFixedProc(pkgList, ip).mNumExcessiveCpu++;
2775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2776d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
27783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        private void addCachedKill(int num, long minPss, long avgPss, long maxPss) {
27793bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (mNumCachedKill <= 0) {
27803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mNumCachedKill = num;
27813bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMinCachedKillPss = minPss;
27823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mAvgCachedKillPss = avgPss;
27833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMaxCachedKillPss = maxPss;
27843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            } else {
27853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                if (minPss < mMinCachedKillPss) {
27863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    mMinCachedKillPss = minPss;
27873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                }
27883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                if (maxPss > mMaxCachedKillPss) {
27893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    mMaxCachedKillPss = maxPss;
27903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                }
27913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mAvgCachedKillPss = (long)( ((mAvgCachedKillPss*(double)mNumCachedKill) + avgPss)
27923bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        / (mNumCachedKill+num) );
27933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mNumCachedKill += num;
27943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
27953bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
27963bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
27973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        public void reportCachedKill(ArrayMap<String, ProcessState> pkgList, long pss) {
27983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            ensureNotDead();
27993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            mCommonProcess.addCachedKill(1, pss, pss, pss);
28003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
28013bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                return;
28023bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
28033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
28043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            for (int ip=pkgList.size()-1; ip>=0; ip--) {
28053bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                pullFixedProc(pkgList, ip).addCachedKill(1, pss, pss, pss);
28063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
28073bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
28083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
2809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState pullFixedProc(String pkgName) {
2810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mMultiPackage) {
2811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // The array map is still pointing to a common process state
2812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // that is now shared across packages.  Update it to point to
2813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // the new per-package state.
2814164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                ProcessState proc = mStats.mPackages.get(pkgName, mUid).mProcesses.get(mName);
2815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (proc == null) {
2816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    throw new IllegalStateException("Didn't create per-package process");
2817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return proc;
2819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return this;
2821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
282350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        private ProcessState pullFixedProc(ArrayMap<String, ProcessState> pkgList, int index) {
2824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = pkgList.valueAt(index);
282550ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            if (mDead && proc.mCommonProcess != proc) {
282653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                // Somehow we are contining to use a process state that is dead, because
282750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                // it was not being told it was active during the last commit.  We can recover
282850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                // from this by generating a fresh new state, but this is bad because we
282950ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                // are losing whatever data we had in the old process state.
283050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                Log.wtf(TAG, "Pulling dead proc: name=" + mName + " pkg=" + mPackage
283150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                        + " uid=" + mUid + " common.name=" + mCommonProcess.mName);
283250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                proc = mStats.getProcessStateLocked(proc.mPackage, proc.mUid, proc.mName);
283350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            }
2834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (proc.mMultiPackage) {
2835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // The array map is still pointing to a common process state
2836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // that is now shared across packages.  Update it to point to
2837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // the new per-package state.
2838a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn                PackageState pkg = mStats.mPackages.get(pkgList.keyAt(index), proc.mUid);
2839a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn                if (pkg == null) {
2840a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn                    throw new IllegalStateException("No existing package "
2841164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            + pkgList.keyAt(index) + "/" + proc.mUid
2842164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            + " for multi-proc " + proc.mName);
2843a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn                }
2844a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn                proc = pkg.mProcesses.get(proc.mName);
2845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (proc == null) {
2846164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    throw new IllegalStateException("Didn't create per-package process "
2847164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            + proc.mName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid);
2848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pkgList.setValueAt(index, proc);
2850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return proc;
2852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getDuration(int state, long now) {
2855cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            long time = super.getDuration(state, now);
2856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState == state) {
2857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - mStartTime;
2858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return time;
2860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssSampleCount(int state) {
2863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
28648a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_SAMPLE_COUNT) : 0;
2865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssMinimum(int state) {
2868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
28698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MINIMUM) : 0;
2870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssAverage(int state) {
2873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
28748a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_AVERAGE) : 0;
2875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssMaximum(int state) {
2878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
28798a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MAXIMUM) : 0;
2880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssUssMinimum(int state) {
2883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
28848a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MINIMUM) : 0;
2885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssUssAverage(int state) {
2888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
28898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_AVERAGE) : 0;
2890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssUssMaximum(int state) {
2893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
28948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0;
2895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2896164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn
2897164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        public String toString() {
2898164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            StringBuilder sb = new StringBuilder(128);
2899164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this)))
2900164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    .append(" ").append(mName).append("/").append(mUid)
2901164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    .append(" pkg=").append(mPackage);
2902164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mMultiPackage) sb.append(" (multi)");
2903164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mCommonProcess != this) sb.append(" (sub)");
2904164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            sb.append("}");
2905164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            return sb.toString();
2906164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        }
2907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2908d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2909cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    public static final class ServiceState extends DurationsTable {
291069cb00b8dda60eff7449b69723f4e73a28e944f8Dianne Hackborn        public final String mPackage;
2911be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public final String mProcessName;
2912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState mProc;
2913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2914164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        Object mOwner;
2915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2916be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public static final int SERVICE_RUN = 0;
2917be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public static final int SERVICE_STARTED = 1;
2918be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public static final int SERVICE_BOUND = 2;
2919be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public static final int SERVICE_EXEC = 3;
2920be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        static final int SERVICE_COUNT = 4;
2921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2922be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        int mRunCount;
2923be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public int mRunState = STATE_NOTHING;
2924be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        long mRunStartTime;
2925be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
2926daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        boolean mStarted;
2927daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        boolean mRestarting;
2928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mStartedCount;
2929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public int mStartedState = STATE_NOTHING;
2930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mStartedStartTime;
2931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mBoundCount;
2933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public int mBoundState = STATE_NOTHING;
2934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mBoundStartTime;
2935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mExecCount;
2937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public int mExecState = STATE_NOTHING;
2938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mExecStartTime;
2939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2940be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public ServiceState(ProcessStats processStats, String pkg, String name,
2941be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                String processName, ProcessState proc) {
2942cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            super(processStats, name);
2943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPackage = pkg;
2944be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mProcessName = processName;
2945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mProc = proc;
2946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2948164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        public void applyNewOwner(Object newOwner) {
2949164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner != newOwner) {
2950164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (mOwner == null) {
2951164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    mOwner = newOwner;
2952164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    mProc.incActiveServices(mName);
2953164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                } else {
2954164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    // There was already an old owner, reset this object for its
2955164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    // new owner.
2956164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    mOwner = newOwner;
2957daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) {
2958164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        long now = SystemClock.uptimeMillis();
2959daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        if (mStarted) {
2960164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
2961164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + " from " + mOwner + " while started: pkg="
2962164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + mPackage + " service=" + mName + " proc=" + mProc);
2963164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            setStarted(false, 0, now);
2964164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
2965164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (mBoundState != STATE_NOTHING) {
2966164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
2967164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + " from " + mOwner + " while bound: pkg="
2968164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + mPackage + " service=" + mName + " proc=" + mProc);
2969164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            setBound(false, 0, now);
2970164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
2971164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (mExecState != STATE_NOTHING) {
2972164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
2973164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + " from " + mOwner + " while executing: pkg="
2974164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + mPackage + " service=" + mName + " proc=" + mProc);
2975164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            setExecuting(false, 0, now);
2976164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
2977164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
2978164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                }
2979be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
2980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2982878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn        public void clearCurrentOwner(Object owner, boolean silently) {
2983164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner == owner) {
2984164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mProc.decActiveServices(mName);
2985daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) {
2986164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    long now = SystemClock.uptimeMillis();
2987daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    if (mStarted) {
2988878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        if (!silently) {
2989878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                            Slog.wtfStack(TAG, "Service owner " + owner
2990878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + " cleared while started: pkg=" + mPackage + " service="
2991878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + mName + " proc=" + mProc);
2992878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        }
2993164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        setStarted(false, 0, now);
2994164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
2995164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (mBoundState != STATE_NOTHING) {
2996878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        if (!silently) {
2997878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                            Slog.wtfStack(TAG, "Service owner " + owner
2998878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + " cleared while bound: pkg=" + mPackage + " service="
2999878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + mName + " proc=" + mProc);
3000878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        }
3001164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        setBound(false, 0, now);
3002164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
3003164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (mExecState != STATE_NOTHING) {
3004878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        if (!silently) {
3005878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                            Slog.wtfStack(TAG, "Service owner " + owner
3006878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + " cleared while exec: pkg=" + mPackage + " service="
3007878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + mName + " proc=" + mProc);
3008878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        }
3009164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        setExecuting(false, 0, now);
3010164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
3011164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                }
3012878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                mOwner = null;
3013be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
3014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3016be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public boolean isInUse() {
3017164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            return mOwner != null;
3018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
302060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void add(ServiceState other) {
3021cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            addDurations(other);
3022be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mRunCount += other.mRunCount;
302360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mStartedCount += other.mStartedCount;
302460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mBoundCount += other.mBoundCount;
302560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mExecCount += other.mExecCount;
302660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
302760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
3028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void resetSafely(long now) {
3029cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            resetDurationsSafely();
3030be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mRunCount = mRunState != STATE_NOTHING ? 1 : 0;
3031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0;
3032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0;
3033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mExecCount = mExecState != STATE_NOTHING ? 1 : 0;
3034cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mRunStartTime = mStartedStartTime = mBoundStartTime = mExecStartTime = now;
3035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void writeToParcel(Parcel out, long now) {
3038cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            writeDurationsToParcel(out);
3039be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            out.writeInt(mRunCount);
3040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mStartedCount);
3041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mBoundCount);
3042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mExecCount);
3043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean readFromParcel(Parcel in) {
3046cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (!readDurationsFromParcel(in)) {
3047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return false;
3048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3049be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mRunCount = in.readInt();
3050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartedCount = in.readInt();
3051d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mBoundCount = in.readInt();
3052d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mExecCount = in.readInt();
3053d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return true;
3054d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3055d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
30568a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        void commitStateTime(long now) {
3057be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mRunState != STATE_NOTHING) {
3058cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT), now - mRunStartTime);
3059be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                mRunStartTime = now;
3060be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
30618a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            if (mStartedState != STATE_NOTHING) {
3062cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT),
306360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        now - mStartedStartTime);
30648a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStartedStartTime = now;
30658a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
30668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            if (mBoundState != STATE_NOTHING) {
3067cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), now - mBoundStartTime);
30688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mBoundStartTime = now;
30698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
30708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            if (mExecState != STATE_NOTHING) {
3071cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime);
30728a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mExecStartTime = now;
30738a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
30748a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        }
30758a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
3076be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        private void updateRunning(int memFactor, long now) {
3077be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            final int state = (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING
3078be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    || mExecState != STATE_NOTHING) ? memFactor : STATE_NOTHING;
3079be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mRunState != state) {
3080be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                if (mRunState != STATE_NOTHING) {
3081cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT),
3082be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                            now - mRunStartTime);
3083be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                } else if (state != STATE_NOTHING) {
3084be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    mRunCount++;
3085be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                }
3086be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                mRunState = state;
3087be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                mRunStartTime = now;
3088be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
3089be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
3090be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
3091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setStarted(boolean started, int memFactor, long now) {
3092164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner == null) {
3093164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtf(TAG, "Starting service " + this + " without owner");
3094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3095daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            mStarted = started;
3096daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            updateStartedState(memFactor, now);
3097daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
3098daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn
3099daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        public void setRestarting(boolean restarting, int memFactor, long now) {
3100daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            mRestarting = restarting;
3101daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            updateStartedState(memFactor, now);
3102daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
3103daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn
3104daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        void updateStartedState(int memFactor, long now) {
3105ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn            final boolean wasStarted = mStartedState != STATE_NOTHING;
3106daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            final boolean started = mStarted || mRestarting;
3107ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn            final int state = started ? memFactor : STATE_NOTHING;
3108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mStartedState != state) {
3109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mStartedState != STATE_NOTHING) {
3110cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT),
311160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            now - mStartedStartTime);
3112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (started) {
3113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mStartedCount++;
3114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartedState = state;
3116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartedStartTime = now;
3117ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn                mProc = mProc.pullFixedProc(mPackage);
3118ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn                if (wasStarted != started) {
3119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (started) {
3120daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        mProc.incStartedServices(memFactor, now, mName);
3121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
3122daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        mProc.decStartedServices(memFactor, now, mName);
3123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
3124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3125be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                updateRunning(memFactor, now);
3126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setBound(boolean bound, int memFactor, long now) {
3130164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner == null) {
3131164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtf(TAG, "Binding service " + this + " without owner");
3132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3133ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn            final int state = bound ? memFactor : STATE_NOTHING;
3134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mBoundState != state) {
3135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mBoundState != STATE_NOTHING) {
3136cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT),
313760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            now - mBoundStartTime);
3138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (bound) {
3139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mBoundCount++;
3140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mBoundState = state;
3142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mBoundStartTime = now;
3143be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                updateRunning(memFactor, now);
3144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setExecuting(boolean executing, int memFactor, long now) {
3148164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner == null) {
3149164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtf(TAG, "Executing service " + this + " without owner");
3150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3151ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn            final int state = executing ? memFactor : STATE_NOTHING;
3152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mExecState != state) {
3153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mExecState != STATE_NOTHING) {
3154cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime);
3155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (executing) {
3156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mExecCount++;
3157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mExecState = state;
3159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mExecStartTime = now;
3160be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                updateRunning(memFactor, now);
3161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        private long getDuration(int opType, int curState, long startTime, int memFactor,
3165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long now) {
3166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int state = opType + (memFactor*SERVICE_COUNT);
3167cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            long time = getDuration(state, now);
3168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (curState == memFactor) {
3169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - startTime;
3170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return time;
3172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3173164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn
3174164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        public String toString() {
3175164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            return "ServiceState{" + Integer.toHexString(System.identityHashCode(this))
3176164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    + " " + mName + " pkg=" + mPackage + " proc="
3177164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    + Integer.toHexString(System.identityHashCode(this)) + "}";
3178164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        }
3179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
3180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final class PackageState {
3182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public final ArrayMap<String, ProcessState> mProcesses
3183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                = new ArrayMap<String, ProcessState>();
3184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public final ArrayMap<String, ServiceState> mServices
3185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                = new ArrayMap<String, ServiceState>();
3186cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public final String mPackageName;
3187cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public final int mUid;
3188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3189cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public PackageState(String packageName, int uid) {
3190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mUid = uid;
3191cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mPackageName = packageName;
3192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
3194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
31958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final class ProcessDataCollection {
3196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] screenStates;
3197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] memStates;
3198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] procStates;
3199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
32008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long totalTime;
32018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long numPss;
32028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long minPss;
32038a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long avgPss;
32048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long maxPss;
32058a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long minUss;
32068a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long avgUss;
32078a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long maxUss;
3208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
32098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) {
3210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            screenStates = _screenStates;
3211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            memStates = _memStates;
3212d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            procStates = _procStates;
3213d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3214d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void print(PrintWriter pw, long overallTime, boolean full) {
3216cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (totalTime > overallTime) {
3217cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                pw.print("*");
3218cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
3219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printPercent(pw, (double) totalTime / (double) overallTime);
3220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (numPss > 0) {
3221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" (");
3222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, minPss * 1024);
3223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
3224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, avgPss * 1024);
3225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
3226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, maxPss * 1024);
3227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("/");
3228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, minUss * 1024);
3229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
3230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, avgUss * 1024);
3231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
3232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, maxUss * 1024);
3233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (full) {
3234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(" over ");
3235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(numPss);
3236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(")");
3238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
3241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn}
3242