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;
27b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.util.DebugUtils;
2850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackbornimport android.util.Log;
29d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.Slog;
30d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.SparseArray;
31d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.TimeUtils;
32776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski
33776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinskiimport com.android.internal.util.GrowingArrayUtils;
34776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski
35d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport dalvik.system.VMRuntime;
36776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinskiimport libcore.util.EmptyArray;
37d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.IOException;
3960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.InputStream;
40d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.io.PrintWriter;
41d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.ArrayList;
42d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Arrays;
43d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Collections;
44d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Comparator;
45d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Objects;
46d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
478a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackbornpublic final class ProcessStats implements Parcelable {
48d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String TAG = "ProcessStats";
49d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final boolean DEBUG = false;
50164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn    static final boolean DEBUG_PARCEL = false;
518a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
528a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final String SERVICE_NAME = "procstats";
538a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
54cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    // How often the service commits its data, giving the minimum batching
55cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    // that is done.
56cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    public static long COMMIT_PERIOD = 3*60*60*1000;  // Commit current stats every 3 hours
57cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
58f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    // Minimum uptime period before committing.  If the COMMIT_PERIOD has elapsed but
59f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    // the total uptime has not exceeded this amount, then the commit will be held until
60f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    // it is reached.
61f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static long COMMIT_UPTIME_PERIOD = 60*60*1000;  // Must have at least 1 hour elapsed
62f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
63d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_NOTHING = -1;
64d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_PERSISTENT = 0;
65d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_TOP = 1;
66d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_IMPORTANT_FOREGROUND = 2;
67d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_IMPORTANT_BACKGROUND = 3;
68d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_BACKUP = 4;
69d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_HEAVY_WEIGHT = 5;
70d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_SERVICE = 6;
71d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_SERVICE_RESTARTING = 7;
72d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_RECEIVER = 8;
73d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_HOME = 9;
74d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_LAST_ACTIVITY = 10;
75d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_CACHED_ACTIVITY = 11;
76d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_CACHED_ACTIVITY_CLIENT = 12;
77d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_CACHED_EMPTY = 13;
78d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_COUNT = STATE_CACHED_EMPTY+1;
79d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
80d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_SAMPLE_COUNT = 0;
81d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_MINIMUM = 1;
82d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_AVERAGE = 2;
83d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_MAXIMUM = 3;
84d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_USS_MINIMUM = 4;
85d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_USS_AVERAGE = 5;
86d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_USS_MAXIMUM = 6;
87d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_COUNT = PSS_USS_MAXIMUM+1;
88d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
89f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_SAMPLE_COUNT = 0;
90f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_CACHED_MINIMUM = 1;
91f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_CACHED_AVERAGE = 2;
92f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_CACHED_MAXIMUM = 3;
93f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_FREE_MINIMUM = 4;
94f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_FREE_AVERAGE = 5;
95f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_FREE_MAXIMUM = 6;
96f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_ZRAM_MINIMUM = 7;
97f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_ZRAM_AVERAGE = 8;
98f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_ZRAM_MAXIMUM = 9;
99f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_KERNEL_MINIMUM = 10;
100f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_KERNEL_AVERAGE = 11;
101f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_KERNEL_MAXIMUM = 12;
102f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_NATIVE_MINIMUM = 13;
103f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_NATIVE_AVERAGE = 14;
104f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_NATIVE_MAXIMUM = 15;
105f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static final int SYS_MEM_USAGE_COUNT = SYS_MEM_USAGE_NATIVE_MAXIMUM+1;
106f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_NOTHING = -1;
108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_NORMAL = 0;
109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_MODERATE = 1;
110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_LOW = 2;
111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_CRITICAL = 3;
112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1;
113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT;
114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_SCREEN_OFF = 0;
115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD;
116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_COUNT = ADJ_SCREEN_ON*2;
117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int FLAG_COMPLETE = 1<<0;
119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int FLAG_SHUTDOWN = 1<<1;
120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int FLAG_SYSPROPS = 1<<2;
121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL,
1238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL };
1248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
1258a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON };
1268a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
1278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] NON_CACHED_PROC_STATES = new int[] {
1288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND,
129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT,
1308a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER
1318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    };
1328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
1338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] BACKGROUND_PROC_STATES = new int[] {
1348a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP,
1358a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER
136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Map from process states to the states we track.
139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final int[] PROCESS_STATE_TO_STATE = new int[] {
140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT
141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT_UI
142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_TOP,                      // ActivityManager.PROCESS_STATE_TOP
143ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn            STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
1444870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
1454870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            STATE_TOP,                      // ActivityManager.PROCESS_STATE_TOP_SLEEPING
146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_IMPORTANT_BACKGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_BACKUP,                   // ActivityManager.PROCESS_STATE_BACKUP
149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HEAVY_WEIGHT,             // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_SERVICE,                  // ActivityManager.PROCESS_STATE_SERVICE
151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_RECEIVER,                 // ActivityManager.PROCESS_STATE_RECEIVER
152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HOME,                     // ActivityManager.PROCESS_STATE_HOME
153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_LAST_ACTIVITY,            // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_ACTIVITY,          // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_ACTIVITY_CLIENT,   // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_EMPTY,             // ActivityManager.PROCESS_STATE_CACHED_EMPTY
157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT,
160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP,
161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER,
162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY,
163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY
164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] STATE_NAMES = new String[] {
167237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            "Persist", "Top    ", "ImpFg  ", "ImpBg  ",
168237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            "Backup ", "HeavyWt", "Service", "ServRst",
169237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            "Receivr", "Home   ",
170237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            "LastAct", "CchAct ", "CchCAct", "CchEmty"
171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] {
174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "off", "on"
175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final String[] ADJ_MEM_NAMES_CSV = new String[] {
178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "norm", "mod",  "low", "crit"
179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final String[] STATE_NAMES_CSV = new String[] {
182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "pers", "top", "impfg", "impbg", "backup", "heavy",
183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "service", "service-rs", "receiver", "home", "lastact",
184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "cch-activity", "cch-aclient", "cch-empty"
185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] ADJ_SCREEN_TAGS = new String[] {
188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "0", "1"
189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] ADJ_MEM_TAGS = new String[] {
192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "n", "m",  "l", "c"
193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] STATE_TAGS = new String[] {
196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "p", "t", "f", "b", "u", "w",
197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "s", "x", "r", "h", "l", "a", "c", "e"
198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String CSV_SEP = "\t";
201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Current version of the parcel format.
203f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    private static final int PARCEL_VERSION = 18;
204d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private static final int MAGIC = 0x50535453;
206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Where the "type"/"state" part of the data appears in an offset integer.
208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_TYPE_SHIFT = 0;
209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_TYPE_MASK = 0xff;
210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Where the "which array" part of the data appears in an offset integer.
211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_ARRAY_SHIFT = 8;
212d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_ARRAY_MASK = 0xff;
213d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Where the "index into array" part of the data appears in an offset integer.
214d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_INDEX_SHIFT = 16;
215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_INDEX_MASK = 0xffff;
216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public String mReadError;
218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public String mTimePeriodStartClockStr;
219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public int mFlags;
220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn    public final ProcessMap<SparseArray<PackageState>> mPackages
2228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            = new ProcessMap<SparseArray<PackageState>>();
223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>();
224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public final long[] mMemFactorDurations = new long[ADJ_COUNT];
226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public int mMemFactor = STATE_NOTHING;
227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mStartTime;
228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
229f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public int[] mSysMemUsageTable = null;
230f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public int mSysMemUsageTableSize = 0;
231f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public final long[] mSysMemUsageArgs = new long[SYS_MEM_USAGE_COUNT];
232f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mTimePeriodStartClock;
234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mTimePeriodStartRealtime;
235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mTimePeriodEndRealtime;
236f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public long mTimePeriodStartUptime;
237f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public long mTimePeriodEndUptime;
238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    String mRuntime;
239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    boolean mRunning;
240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final int LONGS_SIZE = 4096;
242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    final ArrayList<long[]> mLongs = new ArrayList<long[]>();
243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int mNextLong;
244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int[] mAddLongTable;
246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int mAddLongTableSize;
247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
248be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    // For writing parcels.
249be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    ArrayMap<String, Integer> mCommonStringToIndex;
250be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
251be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    // For reading parcels.
252be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    ArrayList<String> mIndexToCommonString;
253be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public ProcessStats(boolean running) {
255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mRunning = running;
256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        reset();
257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
25923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public ProcessStats(Parcel in) {
26023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        reset();
26123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        readFromParcel(in);
26223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    }
26323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
26460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    public void add(ProcessStats other) {
2658472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = other.mPackages.getMap();
26660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
2678472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final String pkgName = pkgMap.keyAt(ip);
2688472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
26960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
2708472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final int uid = uids.keyAt(iu);
2718472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final SparseArray<PackageState> versions = uids.valueAt(iu);
2728472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                for (int iv=0; iv<versions.size(); iv++) {
2738472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int vers = versions.keyAt(iv);
2748472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final PackageState otherState = versions.valueAt(iv);
2758472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NPROCS = otherState.mProcesses.size();
2768472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NSRVS = otherState.mServices.size();
2778472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
2788472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ProcessState otherProc = otherState.mProcesses.valueAt(iproc);
2798472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (otherProc.mCommonProcess != otherProc) {
2808472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid
2818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                    + " vers " + vers + " proc " + otherProc.mName);
2828472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            ProcessState thisProc = getProcessStateLocked(pkgName, uid, vers,
2838472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                    otherProc.mName);
2848472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (thisProc.mCommonProcess == thisProc) {
2858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting");
2868472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                thisProc.mMultiPackage = true;
2878472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                long now = SystemClock.uptimeMillis();
2888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                final PackageState pkgState = getPackageStateLocked(pkgName, uid,
2898472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                        vers);
2908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                thisProc = thisProc.clone(thisProc.mPackage, now);
2918472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                pkgState.mProcesses.put(thisProc.mName, thisProc);
2928472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            }
2938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            thisProc.add(otherProc);
29460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        }
29560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    }
2968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int isvc=0; isvc<NSRVS; isvc++) {
2978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ServiceState otherSvc = otherState.mServices.valueAt(isvc);
2988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid
2998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                + " service " + otherSvc.mName);
3008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ServiceState thisSvc = getServiceStateLocked(pkgName, uid, vers,
3018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                otherSvc.mProcessName, otherSvc.mName);
3028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        thisSvc.add(otherSvc);
3038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    }
30460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
30560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
30660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
30760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
30860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap();
30960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        for (int ip=0; ip<procMap.size(); ip++) {
31060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
31160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
31260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int uid = uids.keyAt(iu);
31360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                ProcessState otherProc = uids.valueAt(iu);
31460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                ProcessState thisProc = mProcesses.get(otherProc.mName, uid);
31560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + otherProc.mName);
31660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (thisProc == null) {
31760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "Creating new process!");
3188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    thisProc = new ProcessState(this, otherProc.mPackage, uid, otherProc.mVersion,
3198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            otherProc.mName);
32060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    mProcesses.put(otherProc.mName, uid, thisProc);
3218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    PackageState thisState = getPackageStateLocked(otherProc.mPackage, uid,
3228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            otherProc.mVersion);
32360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (!thisState.mProcesses.containsKey(otherProc.mName)) {
32460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        thisState.mProcesses.put(otherProc.mName, thisProc);
32560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    }
32660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
32760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                thisProc.add(otherProc);
32860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
32960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
33060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
33160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        for (int i=0; i<ADJ_COUNT; i++) {
33260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by "
33360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    + other.mMemFactorDurations[i] + " from "
33460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    + mMemFactorDurations[i]);
33560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mMemFactorDurations[i] += other.mMemFactorDurations[i];
33660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
33760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
338f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int i=0; i<other.mSysMemUsageTableSize; i++) {
339f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            int ent = other.mSysMemUsageTable[i];
340f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
341f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            long[] longs = other.mLongs.get((ent>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
342f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            addSysMemUsage(state, longs, ((ent >> OFFSET_INDEX_SHIFT) & OFFSET_INDEX_MASK));
343f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
344f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
34560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        if (other.mTimePeriodStartClock < mTimePeriodStartClock) {
34660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mTimePeriodStartClock = other.mTimePeriodStartClock;
34760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mTimePeriodStartClockStr = other.mTimePeriodStartClockStr;
34860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
34960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime;
350f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        mTimePeriodEndUptime += other.mTimePeriodEndUptime - other.mTimePeriodStartUptime;
351f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
352f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
353f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public void addSysMemUsage(long cachedMem, long freeMem, long zramMem, long kernelMem,
354f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            long nativeMem) {
355f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        if (mMemFactor != STATE_NOTHING) {
356f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            int state = mMemFactor * STATE_COUNT;
357f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            mSysMemUsageArgs[SYS_MEM_USAGE_SAMPLE_COUNT] = 1;
358f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            for (int i=0; i<3; i++) {
359f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                mSysMemUsageArgs[SYS_MEM_USAGE_CACHED_MINIMUM + i] = cachedMem;
360f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                mSysMemUsageArgs[SYS_MEM_USAGE_FREE_MINIMUM + i] = freeMem;
361f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                mSysMemUsageArgs[SYS_MEM_USAGE_ZRAM_MINIMUM + i] = zramMem;
362f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                mSysMemUsageArgs[SYS_MEM_USAGE_KERNEL_MINIMUM + i] = kernelMem;
363f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                mSysMemUsageArgs[SYS_MEM_USAGE_NATIVE_MINIMUM + i] = nativeMem;
364f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            }
365f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            addSysMemUsage(state, mSysMemUsageArgs, 0);
366f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
367f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
368f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
369f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    void addSysMemUsage(int state, long[] data, int dataOff) {
370f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        int idx = binarySearch(mSysMemUsageTable, mSysMemUsageTableSize, state);
371f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        int off;
372f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        if (idx >= 0) {
373f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            off = mSysMemUsageTable[idx];
374f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        } else {
375f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            mAddLongTable = mSysMemUsageTable;
376f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            mAddLongTableSize = mSysMemUsageTableSize;
377f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            off = addLongData(~idx, state, SYS_MEM_USAGE_COUNT);
378f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            mSysMemUsageTable = mAddLongTable;
379f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            mSysMemUsageTableSize = mAddLongTableSize;
380f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
381f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
382f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK;
383f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        addSysMemUsage(longs, idx, data, dataOff);
384f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
385f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
386f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    static void addSysMemUsage(long[] dstData, int dstOff, long[] addData, int addOff) {
387f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        final long dstCount = dstData[dstOff+SYS_MEM_USAGE_SAMPLE_COUNT];
388f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        final long addCount = addData[addOff+SYS_MEM_USAGE_SAMPLE_COUNT];
389f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        if (dstCount == 0) {
390f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            dstData[dstOff+SYS_MEM_USAGE_SAMPLE_COUNT] = addCount;
391f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            for (int i=SYS_MEM_USAGE_CACHED_MINIMUM; i<SYS_MEM_USAGE_COUNT; i++) {
392f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                dstData[dstOff+i] = addData[addOff+i];
393f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            }
394f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        } else if (addCount > 0) {
395f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            dstData[dstOff+SYS_MEM_USAGE_SAMPLE_COUNT] = dstCount + addCount;
396f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            for (int i=SYS_MEM_USAGE_CACHED_MINIMUM; i<SYS_MEM_USAGE_COUNT; i+=3) {
397f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (dstData[dstOff+i] > addData[addOff+i]) {
398f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    dstData[dstOff+i] = addData[addOff+i];
399f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
400f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                dstData[dstOff+i+1] = (long)(
401f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        ((dstData[dstOff+i+1]*(double)dstCount)
402f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                                + (addData[addOff+i+1]*(double)addCount))
403f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                                / (dstCount+addCount) );
404f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (dstData[dstOff+i+2] < addData[addOff+i+2]) {
405f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    dstData[dstOff+i+2] = addData[addOff+i+2];
406f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
407f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            }
408f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
40960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
41060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
41123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public static final Parcelable.Creator<ProcessStats> CREATOR
41223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            = new Parcelable.Creator<ProcessStats>() {
41323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        public ProcessStats createFromParcel(Parcel in) {
41423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            return new ProcessStats(in);
41523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        }
41623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
41723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        public ProcessStats[] newArray(int size) {
41823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            return new ProcessStats[size];
41923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        }
42023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    };
42123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
4228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    private static void printScreenLabel(PrintWriter pw, int offset) {
423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        switch (offset) {
424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_NOTHING:
425237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("     ");
426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_OFF:
428237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("SOff/");
429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_ON:
431237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("SOn /");
432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            default:
434237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("????/");
435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
4398a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static void printScreenLabelCsv(PrintWriter pw, int offset) {
440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        switch (offset) {
441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_NOTHING:
442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_OFF:
444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(ADJ_SCREEN_NAMES_CSV[0]);
445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_ON:
447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(ADJ_SCREEN_NAMES_CSV[1]);
448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            default:
450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("???");
451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
455237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn    private static void printMemLabel(PrintWriter pw, int offset, char sep) {
456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        switch (offset) {
457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_NOTHING:
458237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("    ");
459237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(' ');
460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_NORMAL:
462237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("Norm");
463237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_MODERATE:
466237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("Mod ");
467237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_LOW:
470237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("Low ");
471237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_CRITICAL:
474237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("Crit");
475237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            default:
478237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                pw.print("????");
479237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if (sep != 0) pw.print(sep);
480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
4848a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static void printMemLabelCsv(PrintWriter pw, int offset) {
485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (offset >= ADJ_MEM_FACTOR_NORMAL) {
486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (offset <= ADJ_MEM_FACTOR_CRITICAL) {
487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(ADJ_MEM_NAMES_CSV[offset]);
488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("???");
490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
4948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static long dumpSingleTime(PrintWriter pw, String prefix, long[] durations,
495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int curState, long curStartTime, long now) {
496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int state = imem+iscreen;
502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long time = durations[state];
503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                String running = "";
504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (curState == state) {
505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    time += now - curStartTime;
506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (pw != null) {
507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        running = " (running)";
508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (time != 0) {
511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (pw != null) {
512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printScreenLabel(pw, printedScreen != iscreen
514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ? iscreen : STATE_NOTHING);
515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedScreen = iscreen;
516237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0);
517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedMem = imem;
518237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        pw.print(": ");
519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        TimeUtils.formatDuration(time, pw); pw.println(running);
520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    totalTime += time;
522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totalTime != 0 && pw != null) {
526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
527237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print("    TOTAL: ");
528d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            TimeUtils.formatDuration(totalTime, pw);
529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return totalTime;
532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpAdjTimesCheckin(PrintWriter pw, String sep, long[] durations,
535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int curState, long curStartTime, long now) {
536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int state = imem+iscreen;
539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long time = durations[state];
540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (curState == state) {
541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    time += now - curStartTime;
542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (time != 0) {
544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    printAdjTagAndValue(pw, state, time);
545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpServiceTimeCheckin(PrintWriter pw, String label, String packageName,
5518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            int uid, int vers, String serviceName, ServiceState svc, int serviceType, int opCount,
552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int curState, long curStartTime, long now) {
553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (opCount <= 0) {
554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(label);
557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(packageName);
559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(uid);
561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
5628472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        pw.print(vers);
5638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        pw.print(",");
564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(serviceName);
565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(opCount);
567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean didCurState = false;
568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<svc.mDurationsTableSize; i++) {
569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int off = svc.mDurationsTable[i];
570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int memFactor = type / ServiceState.SERVICE_COUNT;
572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            type %= ServiceState.SERVICE_COUNT;
573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (type != serviceType) {
574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                continue;
575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
5768a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long time = svc.mStats.getLong(off, 0);
577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (curState == memFactor) {
578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                didCurState = true;
579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - curStartTime;
580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printAdjTagAndValue(pw, memFactor, time);
582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!didCurState && curState != STATE_NOTHING) {
584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printAdjTagAndValue(pw, curState, now - curStartTime);
585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
5898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static void computeProcessData(ProcessState proc, ProcessDataCollection data, long now) {
590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        data.totalTime = 0;
591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        data.numPss = data.minPss = data.avgPss = data.maxPss =
592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                data.minUss = data.avgUss = data.maxUss = 0;
593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<data.screenStates.length; is++) {
594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<data.memStates.length; im++) {
595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<data.procStates.length; ip++) {
596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT)
597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + data.procStates[ip];
598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    data.totalTime += proc.getDuration(bucket, now);
599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long samples = proc.getPssSampleCount(bucket);
600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (samples > 0) {
601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long minPss = proc.getPssMinimum(bucket);
602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long avgPss = proc.getPssAverage(bucket);
603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long maxPss = proc.getPssMaximum(bucket);
604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long minUss = proc.getPssUssMinimum(bucket);
605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long avgUss = proc.getPssUssAverage(bucket);
606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long maxUss = proc.getPssUssMaximum(bucket);
607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (data.numPss == 0) {
608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.minPss = minPss;
609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgPss = avgPss;
610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.maxPss = maxPss;
611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.minUss = minUss;
612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgUss = avgUss;
613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.maxUss = maxUss;
614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        } else {
615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (minPss < data.minPss) {
616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.minPss = minPss;
617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgPss = (long)( ((data.avgPss*(double)data.numPss)
619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    + (avgPss*(double)samples)) / (data.numPss+samples) );
620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (maxPss > data.maxPss) {
621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.maxPss = maxPss;
622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (minUss < data.minUss) {
624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.minUss = minUss;
625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgUss = (long)( ((data.avgUss*(double)data.numPss)
627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    + (avgUss*(double)samples)) / (data.numPss+samples) );
628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (maxUss > data.maxUss) {
629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.maxUss = maxUss;
630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        data.numPss += samples;
633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static long computeProcessTimeLocked(ProcessState proc, int[] screenStates, int[] memStates,
640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int[] procStates, long now) {
641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /*
643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<proc.mDurationsTableSize; i++) {
644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int val = proc.mDurationsTable[i];
645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            totalTime += proc.mState.getLong(val, 0);
646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if ((val&0xff) == proc.mCurState) {
647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                totalTime += now - proc.mStartTime;
648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        */
651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<screenStates.length; is++) {
652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<memStates.length; im++) {
653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<procStates.length; ip++) {
654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT)
655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + procStates[ip];
656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    totalTime += proc.getDuration(bucket, now);
657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        proc.mTmpTotalTime = totalTime;
661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return totalTime;
662d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
664f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    static class PssAggr {
665f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        long pss = 0;
666f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        long samples = 0;
667f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
668f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        void add(long newPss, long newSamples) {
669f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pss = (long)( (pss*(double)samples) + (newPss*(double)newSamples) )
670f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    / (samples+newSamples);
671f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            samples += newSamples;
672f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
673f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
674f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
675f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public void computeTotalMemoryUse(TotalMemoryUseCollection data, long now) {
676f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        data.totalTime = 0;
677f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int i=0; i<STATE_COUNT; i++) {
678f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            data.processStateWeight[i] = 0;
679f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            data.processStatePss[i] = 0;
680f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            data.processStateTime[i] = 0;
681f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            data.processStateSamples[i] = 0;
682f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
683f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int i=0; i<SYS_MEM_USAGE_COUNT; i++) {
684f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            data.sysMemUsage[i] = 0;
685f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
686f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        data.sysMemCachedWeight = 0;
687f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        data.sysMemFreeWeight = 0;
688f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        data.sysMemZRamWeight = 0;
689f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        data.sysMemKernelWeight = 0;
690f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        data.sysMemNativeWeight = 0;
691f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        data.sysMemSamples = 0;
692f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        long[] totalMemUsage = new long[SYS_MEM_USAGE_COUNT];
693f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int i=0; i<mSysMemUsageTableSize; i++) {
694f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            int ent = mSysMemUsageTable[i];
695f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            long[] longs = mLongs.get((ent>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
696f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            int idx = (ent >> OFFSET_INDEX_SHIFT) & OFFSET_INDEX_MASK;
697f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            addSysMemUsage(totalMemUsage, 0, longs, idx);
698f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
699f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int is=0; is<data.screenStates.length; is++) {
700f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            for (int im=0; im<data.memStates.length; im++) {
701f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                int memBucket = data.screenStates[is] + data.memStates[im];
702f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                int stateBucket = memBucket * STATE_COUNT;
703f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                long memTime = mMemFactorDurations[memBucket];
704f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (mMemFactor == memBucket) {
705f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    memTime += now - mStartTime;
706f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
707f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                data.totalTime += memTime;
708f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                int sysIdx = binarySearch(mSysMemUsageTable, mSysMemUsageTableSize, stateBucket);
709f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                long[] longs = totalMemUsage;
710f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                int idx = 0;
711f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (sysIdx >= 0) {
712f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    int ent = mSysMemUsageTable[sysIdx];
713f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    long[] tmpLongs = mLongs.get((ent>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
714f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    int tmpIdx = (ent >> OFFSET_INDEX_SHIFT) & OFFSET_INDEX_MASK;
715f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    if (tmpLongs[tmpIdx+SYS_MEM_USAGE_SAMPLE_COUNT] >= 3) {
716f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        addSysMemUsage(data.sysMemUsage, 0, longs, idx);
717f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        longs = tmpLongs;
718f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        idx = tmpIdx;
719f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    }
720f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
721f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                data.sysMemCachedWeight += longs[idx+SYS_MEM_USAGE_CACHED_AVERAGE]
722f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        * (double)memTime;
723f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                data.sysMemFreeWeight += longs[idx+SYS_MEM_USAGE_FREE_AVERAGE]
724f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        * (double)memTime;
725f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                data.sysMemZRamWeight += longs[idx+SYS_MEM_USAGE_ZRAM_AVERAGE]
726f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        * (double)memTime;
727f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                data.sysMemKernelWeight += longs[idx+SYS_MEM_USAGE_KERNEL_AVERAGE]
728f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        * (double)memTime;
729f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                data.sysMemNativeWeight += longs[idx+SYS_MEM_USAGE_NATIVE_AVERAGE]
730f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        * (double)memTime;
731f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                data.sysMemSamples += longs[idx+SYS_MEM_USAGE_SAMPLE_COUNT];
732f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn             }
733f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
734f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
735f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int iproc=0; iproc<procMap.size(); iproc++) {
736f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(iproc);
737f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
738f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                final ProcessState proc = uids.valueAt(iu);
739f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                final PssAggr fgPss = new PssAggr();
740f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                final PssAggr bgPss = new PssAggr();
741f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                final PssAggr cachedPss = new PssAggr();
742f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                boolean havePss = false;
743f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                for (int i=0; i<proc.mDurationsTableSize; i++) {
744f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    int off = proc.mDurationsTable[i];
745f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
746f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    int procState = type % STATE_COUNT;
747f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    long samples = proc.getPssSampleCount(type);
748f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    if (samples > 0) {
749f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        long avg = proc.getPssAverage(type);
750f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        havePss = true;
751f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        if (procState <= STATE_IMPORTANT_FOREGROUND) {
752f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            fgPss.add(avg, samples);
753f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        } else if (procState <= STATE_RECEIVER) {
754f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            bgPss.add(avg, samples);
755f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        } else {
756f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            cachedPss.add(avg, samples);
757f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        }
758f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    }
759f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
760f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (!havePss) {
761f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    continue;
762f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
763f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                boolean fgHasBg = false;
764f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                boolean fgHasCached = false;
765f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                boolean bgHasCached = false;
766f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (fgPss.samples < 3 && bgPss.samples > 0) {
767f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    fgHasBg = true;
768f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    fgPss.add(bgPss.pss, bgPss.samples);
769f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
770f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (fgPss.samples < 3 && cachedPss.samples > 0) {
771f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    fgHasCached = true;
772f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    fgPss.add(cachedPss.pss, cachedPss.samples);
773f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
774f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (bgPss.samples < 3 && cachedPss.samples > 0) {
775f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    bgHasCached = true;
776f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    bgPss.add(cachedPss.pss, cachedPss.samples);
777f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
778f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (bgPss.samples < 3 && !fgHasBg && fgPss.samples > 0) {
779f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    bgPss.add(fgPss.pss, fgPss.samples);
780f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
781f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (cachedPss.samples < 3 && !bgHasCached && bgPss.samples > 0) {
782f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    cachedPss.add(bgPss.pss, bgPss.samples);
783f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
784f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (cachedPss.samples < 3 && !fgHasCached && fgPss.samples > 0) {
785f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    cachedPss.add(fgPss.pss, fgPss.samples);
786f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
787f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                for (int i=0; i<proc.mDurationsTableSize; i++) {
788f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    final int off = proc.mDurationsTable[i];
789f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    final int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
790f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    long time = getLong(off, 0);
791f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    if (proc.mCurState == type) {
792f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        time += now - proc.mStartTime;
793f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    }
794f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    final int procState = type % STATE_COUNT;
795f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    data.processStateTime[procState] += time;
796f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    long samples = proc.getPssSampleCount(type);
797f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    long avg;
798f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    if (samples > 0) {
799f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        avg = proc.getPssAverage(type);
800f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    } else if (procState <= STATE_IMPORTANT_FOREGROUND) {
801f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        samples = fgPss.samples;
802f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        avg = fgPss.pss;
803f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    } else if (procState <= STATE_RECEIVER) {
804f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        samples = bgPss.samples;
805f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        avg = bgPss.pss;
806f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    } else {
807f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        samples = cachedPss.samples;
808f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        avg = cachedPss.pss;
809f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    }
810f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    double newAvg = ( (data.processStatePss[procState]
811f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            * (double)data.processStateSamples[procState])
812f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                                + (avg*(double)samples)
813f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            ) / (data.processStateSamples[procState]+samples);
814f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    data.processStatePss[procState] = (long)newAvg;
815f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    data.processStateSamples[procState] += samples;
816f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    data.processStateWeight[procState] += avg * (double)time;
817f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
818f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            }
819f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
820f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
821f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessState(PrintWriter pw, String prefix, ProcessState proc,
823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] screenStates, int[] memStates, int[] procStates, long now) {
824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
825d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
826d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<screenStates.length; is++) {
827d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<memStates.length; im++) {
829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<procStates.length; ip++) {
830d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int iscreen = screenStates[is];
831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int imem = memStates[im];
832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long time = proc.getDuration(bucket, now);
834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    String running = "";
835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (proc.mCurState == bucket) {
836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        running = " (running)";
837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (time != 0) {
839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
840d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (screenStates.length > 1) {
841d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printScreenLabel(pw, printedScreen != iscreen
842d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    ? iscreen : STATE_NOTHING);
843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedScreen = iscreen;
844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (memStates.length > 1) {
846237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                            printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/');
847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedMem = imem;
848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        TimeUtils.formatDuration(time, pw); pw.println(running);
851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        totalTime += time;
852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
855d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totalTime != 0) {
857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (screenStates.length > 1) {
859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printScreenLabel(pw, STATE_NOTHING);
860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (memStates.length > 1) {
862237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                printMemLabel(pw, STATE_NOTHING, '/');
863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
864237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print("TOTAL  : ");
865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            TimeUtils.formatDuration(totalTime, pw);
866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
869d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessPss(PrintWriter pw, String prefix, ProcessState proc, int[] screenStates,
871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] memStates, int[] procStates) {
872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean printedHeader = false;
873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<screenStates.length; is++) {
875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<memStates.length; im++) {
877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<procStates.length; ip++) {
878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int iscreen = screenStates[is];
879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int imem = memStates[im];
880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long count = proc.getPssSampleCount(bucket);
882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (count > 0) {
883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (!printedHeader) {
884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print(prefix);
885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("PSS/USS (");
886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print(proc.mPssTableSize);
887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.println(" entries):");
888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedHeader = true;
889d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("  ");
892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (screenStates.length > 1) {
893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printScreenLabel(pw, printedScreen != iscreen
894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    ? iscreen : STATE_NOTHING);
895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedScreen = iscreen;
896d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
897d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (memStates.length > 1) {
898237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                            printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/');
899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedMem = imem;
900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
902d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(count);
903d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" samples ");
904b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                        DebugUtils.printSizeValue(pw, proc.getPssMinimum(bucket) * 1024);
905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
906b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                        DebugUtils.printSizeValue(pw, proc.getPssAverage(bucket) * 1024);
907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
908b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                        DebugUtils.printSizeValue(pw, proc.getPssMaximum(bucket) * 1024);
909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" / ");
910b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                        DebugUtils.printSizeValue(pw, proc.getPssUssMinimum(bucket) * 1024);
911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
912b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                        DebugUtils.printSizeValue(pw, proc.getPssUssAverage(bucket) * 1024);
913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
914b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                        DebugUtils.printSizeValue(pw, proc.getPssUssMaximum(bucket) * 1024);
915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println();
916d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
918d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (proc.mNumExcessiveWake != 0) {
921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix); pw.print("Killed for excessive wake locks: ");
922d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(proc.mNumExcessiveWake); pw.println(" times");
923d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
924d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (proc.mNumExcessiveCpu != 0) {
925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix); pw.print("Killed for excessive CPU use: ");
926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(proc.mNumExcessiveCpu); pw.println(" times");
927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
9283bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        if (proc.mNumCachedKill != 0) {
9293bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pw.print(prefix); pw.print("Killed from cached state: ");
9303bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(proc.mNumCachedKill); pw.print(" times from pss ");
931b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                    DebugUtils.printSizeValue(pw, proc.mMinCachedKillPss * 1024); pw.print("-");
932b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                    DebugUtils.printSizeValue(pw, proc.mAvgCachedKillPss * 1024); pw.print("-");
933b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                    DebugUtils.printSizeValue(pw, proc.mMaxCachedKillPss * 1024); pw.println();
9343bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
937f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    long getSysMemUsageValue(int state, int index) {
938f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        int idx = binarySearch(mSysMemUsageTable, mSysMemUsageTableSize, state);
939f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        return idx >= 0 ? getLong(mSysMemUsageTable[idx], index) : 0;
940f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
941f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
942f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    void dumpSysMemUsageCategory(PrintWriter pw, String prefix, String label,
943f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            int bucket, int index) {
944f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(prefix); pw.print(label);
945f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(": ");
946b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        DebugUtils.printSizeValue(pw, getSysMemUsageValue(bucket, index) * 1024);
947f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(" min, ");
948b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        DebugUtils.printSizeValue(pw, getSysMemUsageValue(bucket, index + 1) * 1024);
949f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(" avg, ");
950b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        DebugUtils.printSizeValue(pw, getSysMemUsageValue(bucket, index+2) * 1024);
951f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.println(" max");
952f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
953f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
954f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    void dumpSysMemUsage(PrintWriter pw, String prefix, int[] screenStates,
955f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            int[] memStates) {
956f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        int printedScreen = -1;
957f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int is=0; is<screenStates.length; is++) {
958f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            int printedMem = -1;
959f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            for (int im=0; im<memStates.length; im++) {
960f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                final int iscreen = screenStates[is];
961f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                final int imem = memStates[im];
962f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                final int bucket = ((iscreen + imem) * STATE_COUNT);
963f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                long count = getSysMemUsageValue(bucket, SYS_MEM_USAGE_SAMPLE_COUNT);
964f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                if (count > 0) {
965f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    pw.print(prefix);
966f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    if (screenStates.length > 1) {
967f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        printScreenLabel(pw, printedScreen != iscreen
968f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                                ? iscreen : STATE_NOTHING);
969f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        printedScreen = iscreen;
970f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    }
971f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    if (memStates.length > 1) {
972f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '\0');
973f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        printedMem = imem;
974f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    }
975f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    pw.print(": ");
976f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    pw.print(count);
977f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    pw.println(" samples:");
978f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    dumpSysMemUsageCategory(pw, prefix, "  Cached", bucket,
979f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            SYS_MEM_USAGE_CACHED_MINIMUM);
980f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    dumpSysMemUsageCategory(pw, prefix, "  Free", bucket,
981f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            SYS_MEM_USAGE_FREE_MINIMUM);
982f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    dumpSysMemUsageCategory(pw, prefix, "  ZRam", bucket,
983f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            SYS_MEM_USAGE_ZRAM_MINIMUM);
984f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    dumpSysMemUsageCategory(pw, prefix, "  Kernel", bucket,
985f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            SYS_MEM_USAGE_KERNEL_MINIMUM);
986f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    dumpSysMemUsageCategory(pw, prefix, "  Native", bucket,
987f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            SYS_MEM_USAGE_NATIVE_MINIMUM);
988f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
989f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            }
990f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
991f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
992f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpStateHeadersCsv(PrintWriter pw, String sep, int[] screenStates,
994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] memStates, int[] procStates) {
995d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NS = screenStates != null ? screenStates.length : 1;
996d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NM = memStates != null ? memStates.length : 1;
997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NP = procStates != null ? procStates.length : 1;
998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<NS; is++) {
999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<NM; im++) {
1000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<NP; ip++) {
1001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(sep);
1002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    boolean printed = false;
1003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (screenStates != null && screenStates.length > 1) {
1004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printScreenLabelCsv(pw, screenStates[is]);
1005d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printed = true;
1006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (memStates != null && memStates.length > 1) {
1008d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (printed) {
1009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("-");
1010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
1011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printMemLabelCsv(pw, memStates[im]);
1012d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printed = true;
1013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (procStates != null && procStates.length > 1) {
1015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (printed) {
1016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("-");
1017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
1018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(STATE_NAMES_CSV[procStates[ip]]);
1019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessStateCsv(PrintWriter pw, ProcessState proc,
1026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
1027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepProcStates, int[] procStates, long now) {
1028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NSS = sepScreenStates ? screenStates.length : 1;
1029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NMS = sepMemStates ? memStates.length : 1;
1030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NPS = sepProcStates ? procStates.length : 1;
1031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iss=0; iss<NSS; iss++) {
1032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ims=0; ims<NMS; ims++) {
1033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ips=0; ips<NPS; ips++) {
1034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int vsscreen = sepScreenStates ? screenStates[iss] : 0;
1035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int vsmem = sepMemStates ? memStates[ims] : 0;
1036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int vsproc = sepProcStates ? procStates[ips] : 0;
1037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int NSA = sepScreenStates ? 1 : screenStates.length;
1038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int NMA = sepMemStates ? 1 : memStates.length;
1039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int NPA = sepProcStates ? 1 : procStates.length;
1040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long totalTime = 0;
1041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int isa=0; isa<NSA; isa++) {
1042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        for (int ima=0; ima<NMA; ima++) {
1043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            for (int ipa=0; ipa<NPA; ipa++) {
1044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int vascreen = sepScreenStates ? 0 : screenStates[isa];
1045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int vamem = sepMemStates ? 0 : memStates[ima];
1046d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int vaproc = sepProcStates ? 0 : procStates[ipa];
1047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int bucket = ((vsscreen + vascreen + vsmem + vamem)
1048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                        * STATE_COUNT) + vsproc + vaproc;
1049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                totalTime += proc.getDuration(bucket, now);
1050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
1051d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
1052d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1053d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(CSV_SEP);
1054d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(totalTime);
1055d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1056d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1057d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1058d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1059d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessList(PrintWriter pw, String prefix, ArrayList<ProcessState> procs,
1061d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] screenStates, int[] memStates, int[] procStates, long now) {
1062d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String innerPrefix = prefix + "  ";
1063d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=procs.size()-1; i>=0; i--) {
1064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = procs.get(i);
1065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
1066d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mName);
1067d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" / ");
1068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            UserHandle.formatUid(pw, proc.mUid);
1069d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (");
1070d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mDurationsTableSize);
1071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" entries)");
1072d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println(":");
1073d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessState(pw, innerPrefix, proc, screenStates, memStates, procStates, now);
1074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (proc.mPssTableSize > 0) {
1075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                dumpProcessPss(pw, innerPrefix, proc, screenStates, memStates, procStates);
1076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1077d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1078d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1079d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1080d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessSummaryDetails(PrintWriter pw, ProcessState proc, String prefix,
1081d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String label, int[] screenStates, int[] memStates, int[] procStates,
1082d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            long now, long totalTime, boolean full) {
1083d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessDataCollection totals = new ProcessDataCollection(screenStates,
1084d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                memStates, procStates);
1085d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        computeProcessData(proc, totals, now);
1086d052a9416ae3f7e42fc1e7de0740021df385ee48Dianne Hackborn        double percentage = (double) totals.totalTime / (double) totalTime * 100;
1087d052a9416ae3f7e42fc1e7de0740021df385ee48Dianne Hackborn        // We don't print percentages < .01, so just drop those.
1088d052a9416ae3f7e42fc1e7de0740021df385ee48Dianne Hackborn        if (percentage >= 0.005 || totals.numPss != 0) {
1089d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (prefix != null) {
1090d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(prefix);
1091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1092d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (label != null) {
1093d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(label);
1094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1095d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            totals.print(pw, totalTime, full);
1096d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (prefix != null) {
1097d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println();
1098d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1099d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1100d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessSummaryLocked(PrintWriter pw, String prefix,
1103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ArrayList<ProcessState> procs, int[] screenStates, int[] memStates, int[] procStates,
11048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            boolean inclUidVers, long now, long totalTime) {
1105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=procs.size()-1; i>=0; i--) {
1106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = procs.get(i);
1107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
1108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("* ");
1109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mName);
1110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" / ");
1111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            UserHandle.formatUid(pw, proc.mUid);
11128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            pw.print(" / v");
11138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            pw.print(proc.mVersion);
1114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println(":");
1115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "         TOTAL: ", screenStates, memStates,
1116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    procStates, now, totalTime, true);
1117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "    Persistent: ", screenStates, memStates,
1118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] { STATE_PERSISTENT }, now, totalTime, true);
1119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "           Top: ", screenStates, memStates,
1120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_TOP}, now, totalTime, true);
1121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        Imp Fg: ", screenStates, memStates,
1122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true);
1123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        Imp Bg: ", screenStates, memStates,
1124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true);
1125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        Backup: ", screenStates, memStates,
1126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_BACKUP}, now, totalTime, true);
1127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "     Heavy Wgt: ", screenStates, memStates,
1128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true);
1129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "       Service: ", screenStates, memStates,
1130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_SERVICE}, now, totalTime, true);
1131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "    Service Rs: ", screenStates, memStates,
1132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true);
1133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "      Receiver: ", screenStates, memStates,
1134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_RECEIVER}, now, totalTime, true);
1135237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        (Home): ", screenStates, memStates,
1136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_HOME}, now, totalTime, true);
1137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "    (Last Act): ", screenStates, memStates,
1138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true);
1139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "      (Cached): ", screenStates, memStates,
1140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT,
1141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            STATE_CACHED_EMPTY}, now, totalTime, true);
1142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printPercent(PrintWriter pw, double fraction) {
1146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        fraction *= 100;
1147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (fraction < 1) {
1148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(String.format("%.2f", fraction));
1149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else if (fraction < 10) {
1150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(String.format("%.1f", fraction));
1151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
1152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(String.format("%.0f", fraction));
1153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("%");
1155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static void dumpProcessListCsv(PrintWriter pw, ArrayList<ProcessState> procs,
1158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
1159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepProcStates, int[] procStates, long now) {
1160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("process");
1161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(CSV_SEP);
1162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("uid");
11638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        pw.print(CSV_SEP);
11648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        pw.print("vers");
1165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpStateHeadersCsv(pw, CSV_SEP, sepScreenStates ? screenStates : null,
1166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                sepMemStates ? memStates : null,
1167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                sepProcStates ? procStates : null);
1168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
1169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=procs.size()-1; i>=0; i--) {
1170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = procs.get(i);
1171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mName);
1172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(CSV_SEP);
1173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            UserHandle.formatUid(pw, proc.mUid);
11748472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            pw.print(CSV_SEP);
11758472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            pw.print(proc.mVersion);
1176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessStateCsv(pw, proc, sepScreenStates, screenStates,
1177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    sepMemStates, memStates, sepProcStates, procStates, now);
1178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
1179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int printArrayEntry(PrintWriter pw, String[] array, int value, int mod) {
1183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int index = value/mod;
1184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (index >= 0 && index < array.length) {
1185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(array[index]);
1186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
1187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print('?');
1188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return value - index*mod;
1190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printProcStateTag(PrintWriter pw, int state) {
1193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        state = printArrayEntry(pw, ADJ_SCREEN_TAGS,  state, ADJ_SCREEN_MOD*STATE_COUNT);
1194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        state = printArrayEntry(pw, ADJ_MEM_TAGS,  state, STATE_COUNT);
1195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printArrayEntry(pw, STATE_TAGS,  state, 1);
1196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printAdjTag(PrintWriter pw, int state) {
1199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        state = printArrayEntry(pw, ADJ_SCREEN_TAGS,  state, ADJ_SCREEN_MOD);
1200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printArrayEntry(pw, ADJ_MEM_TAGS, state, 1);
1201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1203d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printProcStateTagAndValue(PrintWriter pw, int state, long value) {
1204d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(',');
1205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printProcStateTag(pw, state);
1206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(':');
1207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(value);
1208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printAdjTagAndValue(PrintWriter pw, int state, long value) {
1211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(',');
1212d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printAdjTag(pw, state);
1213d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(':');
1214d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(value);
1215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpAllProcessStateCheckin(PrintWriter pw, ProcessState proc, long now) {
1218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean didCurState = false;
1219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<proc.mDurationsTableSize; i++) {
1220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int off = proc.mDurationsTable[i];
1221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
12228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long time = proc.mStats.getLong(off, 0);
1223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (proc.mCurState == type) {
1224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                didCurState = true;
1225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - proc.mStartTime;
1226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printProcStateTagAndValue(pw, type, time);
1228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!didCurState && proc.mCurState != STATE_NOTHING) {
1230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printProcStateTagAndValue(pw, proc.mCurState, now - proc.mStartTime);
1231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpAllProcessPssCheckin(PrintWriter pw, ProcessState proc) {
1235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<proc.mPssTableSize; i++) {
1236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int off = proc.mPssTable[i];
1237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
12388a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long count = proc.mStats.getLong(off, PSS_SAMPLE_COUNT);
12398a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long min = proc.mStats.getLong(off, PSS_MINIMUM);
12408a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long avg = proc.mStats.getLong(off, PSS_AVERAGE);
12418a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long max = proc.mStats.getLong(off, PSS_MAXIMUM);
12428a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long umin = proc.mStats.getLong(off, PSS_USS_MINIMUM);
12438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long uavg = proc.mStats.getLong(off, PSS_USS_AVERAGE);
12448a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long umax = proc.mStats.getLong(off, PSS_USS_MAXIMUM);
1245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(',');
1246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printProcStateTag(pw, type);
1247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
1248d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(count);
1249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
1250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(min);
1251d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
1252d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(avg);
1253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
1254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(max);
1255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
1256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(umin);
1257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
1258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(uavg);
1259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
1260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(umax);
1261d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1262d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1263d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1264d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void reset() {
1265d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr);
1266d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        resetCommon();
1267d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mPackages.getMap().clear();
1268d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mProcesses.getMap().clear();
1269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mMemFactor = STATE_NOTHING;
1270d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mStartTime = 0;
1271d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr);
1272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void resetSafely() {
1275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr);
1276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        resetCommon();
12778472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn
12788472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        // First initialize use count of all common processes.
12798472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        final long now = SystemClock.uptimeMillis();
12808472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
1281d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=procMap.size()-1; ip>=0; ip--) {
12828472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<ProcessState> uids = procMap.valueAt(ip);
1283d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=uids.size()-1; iu>=0; iu--) {
12848472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                uids.valueAt(iu).mTmpNumInUse = 0;
12858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn           }
12868472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        }
12878472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn
12888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        // Next reset or prune all per-package processes, and for the ones that are reset
12898472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        // track this back to the common processes.
12908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
12918472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        for (int ip=pkgMap.size()-1; ip>=0; ip--) {
12928472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
12938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            for (int iu=uids.size()-1; iu>=0; iu--) {
12948472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
12958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                for (int iv=vpkgs.size()-1; iv>=0; iv--) {
12968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final PackageState pkgState = vpkgs.valueAt(iv);
12978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) {
12988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        final ProcessState ps = pkgState.mProcesses.valueAt(iproc);
12998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (ps.isInUse()) {
1300dfc60ec523674ac5c72fd88a23999e80b2dd72d1Dianne Hackborn                            ps.resetSafely(now);
13018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            ps.mCommonProcess.mTmpNumInUse++;
13028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            ps.mCommonProcess.mTmpFoundSubProc = ps;
13038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        } else {
13048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pkgState.mProcesses.valueAt(iproc).makeDead();
13058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pkgState.mProcesses.removeAt(iproc);
13068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
13078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    }
13088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) {
13098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        final ServiceState ss = pkgState.mServices.valueAt(isvc);
13108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (ss.isInUse()) {
1311dfc60ec523674ac5c72fd88a23999e80b2dd72d1Dianne Hackborn                            ss.resetSafely(now);
13128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        } else {
13138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pkgState.mServices.removeAt(isvc);
13148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
13158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    }
13168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) {
13178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        vpkgs.removeAt(iv);
13188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    }
13198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                }
13208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                if (vpkgs.size() <= 0) {
1321be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    uids.removeAt(iu);
1322be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                }
1323be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
1324be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (uids.size() <= 0) {
13258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                pkgMap.removeAt(ip);
1326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
13288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn
13298472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        // Finally prune out any common processes that are no longer in use.
13308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        for (int ip=procMap.size()-1; ip>=0; ip--) {
13318472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<ProcessState> uids = procMap.valueAt(ip);
1332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=uids.size()-1; iu>=0; iu--) {
13338472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                ProcessState ps = uids.valueAt(iu);
13348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                if (ps.isInUse() || ps.mTmpNumInUse > 0) {
13358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    // If this is a process for multiple packages, we could at this point
13368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    // be back down to one package.  In that case, we want to revert back
13378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    // to a single shared ProcessState.  We can do this by converting the
13388472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    // current package-specific ProcessState up to the shared ProcessState,
13398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    // throwing away the current one we have here (because nobody else is
13408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    // using it).
13418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    if (!ps.mActive && ps.mMultiPackage && ps.mTmpNumInUse == 1) {
13428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        // Here we go...
13438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ps = ps.mTmpFoundSubProc;
13448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ps.mCommonProcess = ps;
13458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        uids.setValueAt(iu, ps);
1346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
13478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ps.resetSafely(now);
1348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
13498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                } else {
13508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    ps.makeDead();
1351be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    uids.removeAt(iu);
1352be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                }
1353be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
1354be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (uids.size() <= 0) {
13558472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                procMap.removeAt(ip);
1356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
13588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn
1359cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        mStartTime = now;
1360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr);
1361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private void resetCommon() {
1364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartClock = System.currentTimeMillis();
1365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        buildTimePeriodStartClockStr();
1366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime();
1367f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        mTimePeriodStartUptime = mTimePeriodEndUptime = SystemClock.uptimeMillis();
1368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.clear();
1369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.add(new long[LONGS_SIZE]);
1370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mNextLong = 0;
1371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        Arrays.fill(mMemFactorDurations, 0);
1372f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        mSysMemUsageTable = null;
1373f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        mSysMemUsageTableSize = 0;
1374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mStartTime = 0;
1375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mReadError = null;
1376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mFlags = 0;
1377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        evaluateSystemProperties(true);
1378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public boolean evaluateSystemProperties(boolean update) {
1381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean changed = false;
13823c1ff826e0abdffdd76129bf974abb96444dade8Brian Carlstrom        String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib.2",
1383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                VMRuntime.getRuntime().vmLibrary());
1384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!Objects.equals(runtime, mRuntime)) {
1385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            changed = true;
1386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (update) {
1387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mRuntime = runtime;
1388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return changed;
1391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private void buildTimePeriodStartClockStr() {
1394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss",
1395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mTimePeriodStartClock).toString();
1396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final int[] BAD_TABLE = new int[0];
1399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private int[] readTableFromParcel(Parcel in, String name, String what) {
1401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int size = in.readInt();
1402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (size < 0) {
1403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            Slog.w(TAG, "Ignoring existing stats; bad " + what + " table size: " + size);
1404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return BAD_TABLE;
1405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (size == 0) {
1407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return null;
1408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] table = new int[size];
1410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<size; i++) {
1411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            table[i] = in.readInt();
1412164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG_PARCEL) Slog.i(TAG, "Reading in " + name + " table #" + i + ": "
1413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    + ProcessStats.printLongOffset(table[i]));
1414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!validateLongOffset(table[i])) {
1415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: "
1416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + ProcessStats.printLongOffset(table[i]));
1417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return null;
1418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return table;
1421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
142353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn    private void writeCompactedLongArray(Parcel out, long[] array, int num) {
142453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        for (int i=0; i<num; i++) {
1425be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            long val = array[i];
1426be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (val < 0) {
1427be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                Slog.w(TAG, "Time val negative: " + val);
1428be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                val = 0;
1429be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
1430be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (val <= Integer.MAX_VALUE) {
1431be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                out.writeInt((int)val);
1432be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            } else {
1433be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                int top = ~((int)((val>>32)&0x7fffffff));
1434be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                int bottom = (int)(val&0xfffffff);
1435be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                out.writeInt(top);
1436be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                out.writeInt(bottom);
1437be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
1438be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1439be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    }
1440be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
144153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn    private void readCompactedLongArray(Parcel in, int version, long[] array, int num) {
1442be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (version <= 10) {
1443be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            in.readLongArray(array);
1444be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            return;
1445be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
144653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        final int alen = array.length;
144753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        if (num > alen) {
144853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            throw new RuntimeException("bad array lengths: got " + num + " array is " + alen);
1449be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
145053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        int i;
145153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        for (i=0; i<num; i++) {
1452be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            int val = in.readInt();
1453be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (val >= 0) {
1454be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                array[i] = val;
1455be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            } else {
1456be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                int bottom = in.readInt();
1457be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                array[i] = (((long)~val)<<32) | bottom;
1458be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
1459be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
146053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        while (i < alen) {
146153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            array[i] = 0;
146253459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            i++;
146353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        }
1464be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    }
1465be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1466be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    private void writeCommonString(Parcel out, String name) {
1467be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        Integer index = mCommonStringToIndex.get(name);
1468be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (index != null) {
1469be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            out.writeInt(index);
1470be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            return;
1471be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1472be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        index = mCommonStringToIndex.size();
1473be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mCommonStringToIndex.put(name, index);
1474be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        out.writeInt(~index);
1475be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        out.writeString(name);
1476be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    }
1477be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1478be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    private String readCommonString(Parcel in, int version) {
1479be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (version <= 9) {
1480be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            return in.readString();
1481be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1482be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        int index = in.readInt();
1483be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (index >= 0) {
1484be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            return mIndexToCommonString.get(index);
1485be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1486be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        index = ~index;
1487be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        String name = in.readString();
1488be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        while (mIndexToCommonString.size() <= index) {
1489be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mIndexToCommonString.add(null);
1490be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
1491be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mIndexToCommonString.set(index, name);
1492be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        return name;
1493be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    }
1494be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
149523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    @Override
149623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public int describeContents() {
149723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        return 0;
149823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    }
149923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
150023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    @Override
150123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public void writeToParcel(Parcel out, int flags) {
1502f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        writeToParcel(out, SystemClock.uptimeMillis(), flags);
1503f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
1504f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
1505f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    /** @hide */
1506f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public void writeToParcel(Parcel out, long now, int flags) {
1507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(MAGIC);
1508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(PARCEL_VERSION);
1509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(STATE_COUNT);
1510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(ADJ_COUNT);
1511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(PSS_COUNT);
1512f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        out.writeInt(SYS_MEM_USAGE_COUNT);
1513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(LONGS_SIZE);
1514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1515be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.mMap.size());
1516be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
15178a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        // First commit all running times.
15188a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
15198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        final int NPROC = procMap.size();
15208a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        for (int ip=0; ip<NPROC; ip++) {
15218a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
15228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            final int NUID = uids.size();
15238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
15248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                uids.valueAt(iu).commitStateTime(now);
15258a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
15268a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        }
15278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
15288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        final int NPKG = pkgMap.size();
15298a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        for (int ip=0; ip<NPKG; ip++) {
15308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
15318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            final int NUID = uids.size();
15328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
15338472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
15348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final int NVERS = vpkgs.size();
15358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                for (int iv=0; iv<NVERS; iv++) {
15368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    PackageState pkgState = vpkgs.valueAt(iv);
15378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NPROCS = pkgState.mProcesses.size();
15388472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
15398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ProcessState proc = pkgState.mProcesses.valueAt(iproc);
15408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (proc.mCommonProcess != proc) {
15418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            proc.commitStateTime(now);
15428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
15438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    }
15448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NSRVS = pkgState.mServices.size();
15458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int isvc=0; isvc<NSRVS; isvc++) {
15468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        pkgState.mServices.valueAt(isvc).commitStateTime(now);
15478a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    }
15488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                }
15498a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
15508a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        }
15518a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
1552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLong(mTimePeriodStartClock);
1553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLong(mTimePeriodStartRealtime);
1554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLong(mTimePeriodEndRealtime);
1555f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        out.writeLong(mTimePeriodStartUptime);
1556f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        out.writeLong(mTimePeriodEndUptime);
1557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeString(mRuntime);
1558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(mFlags);
1559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(mLongs.size());
1561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(mNextLong);
1562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<(mLongs.size()-1); i++) {
156353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            long[] array = mLongs.get(i);
156453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            writeCompactedLongArray(out, array, array.length);
1565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
15668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        long[] lastLongs = mLongs.get(mLongs.size() - 1);
156753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        writeCompactedLongArray(out, lastLongs, mNextLong);
1568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mMemFactor != STATE_NOTHING) {
1570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mMemFactorDurations[mMemFactor] += now - mStartTime;
1571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
1572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
157353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        writeCompactedLongArray(out, mMemFactorDurations, mMemFactorDurations.length);
1574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1575f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        out.writeInt(mSysMemUsageTableSize);
1576f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int i=0; i<mSysMemUsageTableSize; i++) {
1577f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            if (DEBUG_PARCEL) Slog.i(TAG, "Writing sys mem usage #" + i + ": "
1578f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    + printLongOffset(mSysMemUsageTable[i]));
1579f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            out.writeInt(mSysMemUsageTable[i]);
1580f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
1581f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
1582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(NPROC);
1583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<NPROC; ip++) {
1584be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            writeCommonString(out, procMap.keyAt(ip));
15858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<ProcessState> uids = procMap.valueAt(ip);
1586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int NUID = uids.size();
1587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(NUID);
1588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
1589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(uids.keyAt(iu));
15908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final ProcessState proc = uids.valueAt(iu);
1591be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                writeCommonString(out, proc.mPackage);
15928472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                out.writeInt(proc.mVersion);
1593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                proc.writeToParcel(out, now);
1594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(NPKG);
1597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<NPKG; ip++) {
1598be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            writeCommonString(out, pkgMap.keyAt(ip));
15998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
1600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int NUID = uids.size();
1601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(NUID);
1602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
1603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(uids.keyAt(iu));
16048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
16058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final int NVERS = vpkgs.size();
16068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                out.writeInt(NVERS);
16078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                for (int iv=0; iv<NVERS; iv++) {
16088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    out.writeInt(vpkgs.keyAt(iv));
16098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final PackageState pkgState = vpkgs.valueAt(iv);
16108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NPROCS = pkgState.mProcesses.size();
16118472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    out.writeInt(NPROCS);
16128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
16138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        writeCommonString(out, pkgState.mProcesses.keyAt(iproc));
16148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        final ProcessState proc = pkgState.mProcesses.valueAt(iproc);
16158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (proc.mCommonProcess == proc) {
16168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            // This is the same as the common process we wrote above.
16178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            out.writeInt(0);
16188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        } else {
16198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            // There is separate data for this package's process.
16208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            out.writeInt(1);
16218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            proc.writeToParcel(out, now);
16228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
16238472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    }
16248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NSRVS = pkgState.mServices.size();
16258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    out.writeInt(NSRVS);
16268472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int isvc=0; isvc<NSRVS; isvc++) {
16278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        out.writeString(pkgState.mServices.keyAt(isvc));
16288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        final ServiceState svc = pkgState.mServices.valueAt(isvc);
16298472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        writeCommonString(out, svc.mProcessName);
16308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        svc.writeToParcel(out, now);
1631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1635be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1636be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mCommonStringToIndex = null;
1637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private boolean readCheckedInt(Parcel in, int val, String what) {
1640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int got;
1641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((got=in.readInt()) != val) {
1642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad " + what + ": " + got;
1643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return false;
1644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return true;
1646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
164853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn    static byte[] readFully(InputStream stream, int[] outLen) throws IOException {
164960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        int pos = 0;
165053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        final int initialAvail = stream.available();
165153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384];
165260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        while (true) {
165360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int amt = stream.read(data, pos, data.length-pos);
1654164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos
165553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                    + " of avail " + data.length);
165653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            if (amt < 0) {
1657164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos
165853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                        + " len=" + data.length);
165953459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                outLen[0] = pos;
166060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                return data;
166160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
166260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            pos += amt;
166353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            if (pos >= data.length) {
166453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                byte[] newData = new byte[pos+16384];
1665164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len "
166653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                        + newData.length);
166760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                System.arraycopy(data, 0, newData, 0, pos);
166860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                data = newData;
166960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
167060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
167160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
167260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
167360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    public void read(InputStream stream) {
167460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        try {
167553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            int[] len = new int[1];
167653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            byte[] raw = readFully(stream, len);
167760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            Parcel in = Parcel.obtain();
167853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            in.unmarshall(raw, 0, len[0]);
167960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            in.setDataPosition(0);
168060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            stream.close();
168160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
168260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            readFromParcel(in);
168360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        } catch (IOException e) {
168460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mReadError = "caught exception: " + e;
168560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
168660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
168760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
1688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void readFromParcel(Parcel in) {
1689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final boolean hadData = mPackages.getMap().size() > 0
1690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                || mProcesses.getMap().size() > 0;
1691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (hadData) {
1692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            resetSafely();
1693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, MAGIC, "magic number")) {
1696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int version = in.readInt();
1699be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        if (version != PARCEL_VERSION) {
1700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad version: " + version;
1701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, STATE_COUNT, "state count")) {
1704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1705d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, ADJ_COUNT, "adj count")) {
1707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, PSS_COUNT, "pss count")) {
1710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1712f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        if (!readCheckedInt(in, SYS_MEM_USAGE_COUNT, "sys mem usage count")) {
1713f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            return;
1714f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
1715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, LONGS_SIZE, "longs size")) {
1716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1718d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1719be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mIndexToCommonString = new ArrayList<String>();
1720be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartClock = in.readLong();
1722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        buildTimePeriodStartClockStr();
1723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartRealtime = in.readLong();
1724d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodEndRealtime = in.readLong();
1725f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        mTimePeriodStartUptime = in.readLong();
1726f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        mTimePeriodEndUptime = in.readLong();
1727be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mRuntime = in.readString();
1728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mFlags = in.readInt();
1729d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1730d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NLONGS = in.readInt();
1731d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NEXTLONG = in.readInt();
1732d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.clear();
1733d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<(NLONGS-1); i++) {
1734d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            while (i >= mLongs.size()) {
1735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mLongs.add(new long[LONGS_SIZE]);
1736d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
173753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            readCompactedLongArray(in, version, mLongs.get(i), LONGS_SIZE);
1738d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = new long[LONGS_SIZE];
1740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mNextLong = NEXTLONG;
174153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        readCompactedLongArray(in, version, longs, NEXTLONG);
1742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.add(longs);
1743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
174453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn        readCompactedLongArray(in, version, mMemFactorDurations, mMemFactorDurations.length);
1745d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1746f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        mSysMemUsageTable = readTableFromParcel(in, TAG, "sys mem usage");
1747f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        if (mSysMemUsageTable == BAD_TABLE) {
1748f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            return;
1749f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
1750f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        mSysMemUsageTableSize = mSysMemUsageTable != null ? mSysMemUsageTable.length : 0;
1751f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
1752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int NPROC = in.readInt();
1753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (NPROC < 0) {
1754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad process count: " + NPROC;
1755d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        while (NPROC > 0) {
1758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            NPROC--;
17598472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final String procName = readCommonString(in, version);
1760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (procName == null) {
1761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad process name";
1762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int NUID = in.readInt();
1765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (NUID < 0) {
1766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad uid count: " + NUID;
1767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            while (NUID > 0) {
1770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                NUID--;
17718472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final int uid = in.readInt();
1772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (uid < 0) {
1773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad uid: " + uid;
1774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
17768472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final String pkgName = readCommonString(in, version);
1777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (pkgName == null) {
1778d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad process package name";
1779d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1780d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
17818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final int vers = in.readInt();
1782d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ProcessState proc = hadData ? mProcesses.get(procName, uid) : null;
1783d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (proc != null) {
1784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!proc.readFromParcel(in, false)) {
1785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1786d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else {
17888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    proc = new ProcessState(this, pkgName, uid, vers, procName);
1789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!proc.readFromParcel(in, true)) {
1790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1793164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid
1794164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        + " " + proc);
1795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mProcesses.put(procName, uid, proc);
1796d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1797d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1798d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1799164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes");
1800d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1801d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int NPKG = in.readInt();
1802d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (NPKG < 0) {
1803d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad package count: " + NPKG;
1804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1806d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        while (NPKG > 0) {
1807d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            NPKG--;
18088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final String pkgName = readCommonString(in, version);
1809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (pkgName == null) {
1810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad package name";
1811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int NUID = in.readInt();
1814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (NUID < 0) {
1815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad uid count: " + NUID;
1816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            while (NUID > 0) {
1819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                NUID--;
18208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final int uid = in.readInt();
1821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (uid < 0) {
1822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad uid: " + uid;
1823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
18258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                int NVERS = in.readInt();
18268472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                if (NVERS < 0) {
18278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    mReadError = "bad versions count: " + NVERS;
1828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
18308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                while (NVERS > 0) {
18318472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    NVERS--;
18328472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int vers = in.readInt();
18338472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    PackageState pkgState = new PackageState(pkgName, uid);
18348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    SparseArray<PackageState> vpkg = mPackages.get(pkgName, uid);
18358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    if (vpkg == null) {
18368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        vpkg = new SparseArray<PackageState>();
18378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        mPackages.put(pkgName, uid, vpkg);
1838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
18398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    vpkg.put(vers, pkgState);
18408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    int NPROCS = in.readInt();
18418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    if (NPROCS < 0) {
18428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        mReadError = "bad package process count: " + NPROCS;
1843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
18458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    while (NPROCS > 0) {
18468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        NPROCS--;
18478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        String procName = readCommonString(in, version);
18488472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (procName == null) {
18498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            mReadError = "bad package process name";
18508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            return;
18518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
18528472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        int hasProc = in.readInt();
18538472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid
18548472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                + " process " + procName + " hasProc=" + hasProc);
18558472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ProcessState commonProc = mProcesses.get(procName, uid);
18568472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid
18578472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                + ": " + commonProc);
18588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (commonProc == null) {
18598472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            mReadError = "no common proc: " + procName;
18608472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            return;
18618472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
18628472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (hasProc != 0) {
18638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            // The process for this package is unique to the package; we
18648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            // need to load it.  We don't need to do anything about it if
18658472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            // it is not unique because if someone later looks for it
18668472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            // they will find and use it from the global procs.
18678472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null;
18688472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (proc != null) {
18698472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                if (!proc.readFromParcel(in, false)) {
18708472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                    return;
18718472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                }
18728472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            } else {
18738472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                proc = new ProcessState(commonProc, pkgName, uid, vers, procName,
18748472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                        0);
18758472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                if (!proc.readFromParcel(in, true)) {
18768472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                    return;
18778472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                }
1878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
18798472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: "
18808472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                    + procName + " " + uid + " " + proc);
18818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pkgState.mProcesses.put(procName, proc);
1882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        } else {
18838472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: "
18848472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                    + procName + " " + uid + " " + commonProc);
18858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pkgState.mProcesses.put(procName, commonProc);
1886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
1887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
18888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    int NSRVS = in.readInt();
18898472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    if (NSRVS < 0) {
18908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        mReadError = "bad package service count: " + NSRVS;
1891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
18938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    while (NSRVS > 0) {
18948472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        NSRVS--;
18958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        String serviceName = in.readString();
18968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (serviceName == null) {
18978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            mReadError = "bad package service name";
18988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            return;
18998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
19008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        String processName = version > 9 ? readCommonString(in, version) : null;
19018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null;
19028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (serv == null) {
19038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            serv = new ServiceState(this, pkgName, serviceName, processName, null);
19048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
19058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (!serv.readFromParcel(in)) {
19068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            return;
19078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
19088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: "
19098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                + serviceName + " " + uid + " " + serv);
19108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        pkgState.mServices.put(serviceName, serv);
1911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1916be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        mIndexToCommonString = null;
1917be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
1918164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!");
1919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int addLongData(int index, int type, int num) {
1922d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int off = allocLongData(num);
1923776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski        mAddLongTable = GrowingArrayUtils.insert(
1924776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski                mAddLongTable != null ? mAddLongTable : EmptyArray.INT,
1925776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski                mAddLongTableSize, index, type | off);
1926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mAddLongTableSize++;
1927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return off;
1928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int allocLongData(int num) {
1931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int whichLongs = mLongs.size()-1;
1932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = mLongs.get(whichLongs);
1933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mNextLong + num > longs.length) {
1934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            longs = new long[LONGS_SIZE];
1935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLongs.add(longs);
1936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            whichLongs++;
1937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNextLong = 0;
1938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int off = (whichLongs<<OFFSET_ARRAY_SHIFT) | (mNextLong<<OFFSET_INDEX_SHIFT);
1940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mNextLong += num;
1941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return off;
1942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    boolean validateLongOffset(int off) {
1945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int arr = (off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK;
1946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (arr >= mLongs.size()) {
1947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return false;
1948d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1949d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK;
1950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (idx >= LONGS_SIZE) {
1951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return false;
1952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1953164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG_PARCEL) Slog.d(TAG, "Validated long " + printLongOffset(off)
1954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                + ": " + getLong(off, 0));
1955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return true;
1956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static String printLongOffset(int off) {
1959d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        StringBuilder sb = new StringBuilder(16);
1960d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        sb.append("a"); sb.append((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        sb.append("i"); sb.append((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK);
1962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        sb.append("t"); sb.append((off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK);
1963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return sb.toString();
1964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void setLong(int off, int index, long value) {
1967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1968d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)] = value;
1969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1970d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    long getLong(int off, int index) {
1972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)];
1974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int binarySearch(int[] array, int size, int value) {
1977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int lo = 0;
1978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int hi = size - 1;
1979d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        while (lo <= hi) {
1981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int mid = (lo + hi) >>> 1;
1982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int midVal = (array[mid] >> OFFSET_TYPE_SHIFT) & OFFSET_TYPE_MASK;
1983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (midVal < value) {
1985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                lo = mid + 1;
1986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else if (midVal > value) {
1987d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                hi = mid - 1;
1988d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
1989d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return mid;  // value found
1990d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1991d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1992d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return ~lo;  // value not present
1993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
19958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn    public PackageState getPackageStateLocked(String packageName, int uid, int vers) {
19968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        SparseArray<PackageState> vpkg = mPackages.get(packageName, uid);
19978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        if (vpkg == null) {
19988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            vpkg = new SparseArray<PackageState>();
19998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            mPackages.put(packageName, uid, vpkg);
20008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        }
20018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        PackageState as = vpkg.get(vers);
2002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (as != null) {
2003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return as;
2004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2005cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        as = new PackageState(packageName, uid);
20068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        vpkg.put(vers, as);
2007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return as;
2008d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
20108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn    public ProcessState getProcessStateLocked(String packageName, int uid, int vers,
20118472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            String processName) {
20128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        final PackageState pkgState = getPackageStateLocked(packageName, uid, vers);
2013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState ps = pkgState.mProcesses.get(processName);
2014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (ps != null) {
2015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return ps;
2016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState commonProc = mProcesses.get(processName, uid);
2018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (commonProc == null) {
20198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            commonProc = new ProcessState(this, packageName, uid, vers, processName);
2020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mProcesses.put(processName, uid, commonProc);
2021164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc);
2022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!commonProc.mMultiPackage) {
20248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            if (packageName.equals(commonProc.mPackage) && vers == commonProc.mVersion) {
2025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // This common process is not in use by multiple packages, and
2026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // is for the calling package, so we can just use it directly.
2027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ps = commonProc;
2028164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc);
2029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
2030164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!");
2031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // This common process has not been in use by multiple packages,
2032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // but it was created for a different package than the caller.
2033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // We need to convert it to a multi-package process.
2034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                commonProc.mMultiPackage = true;
2035cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // To do this, we need to make two new process states, one a copy
2036cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // of the current state for the process under the original package
2037cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // name, and the second a free new process state for it as the
2038cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // new package name.
2039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long now = SystemClock.uptimeMillis();
2040cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // First let's make a copy of the current process state and put
2041cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // that under the now unique state for its original package name.
20428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final PackageState commonPkgState = getPackageStateLocked(commonProc.mPackage,
20438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        uid, commonProc.mVersion);
2044cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (commonPkgState != null) {
2045164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    ProcessState cloned = commonProc.clone(commonProc.mPackage, now);
2046164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.mPackage
2047164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            + ": " + cloned);
2048164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    commonPkgState.mProcesses.put(commonProc.mName, cloned);
2049164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    // If this has active services, we need to update their process pointer
2050164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    // to point to the new package-specific process state.
2051164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    for (int i=commonPkgState.mServices.size()-1; i>=0; i--) {
2052164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        ServiceState ss = commonPkgState.mServices.valueAt(i);
2053164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (ss.mProc == commonProc) {
2054164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: "
2055164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + ss);
2056164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            ss.mProc = cloned;
2057164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        } else if (DEBUG) {
2058164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            Slog.d(TAG, "GETPROC leaving proc of " + ss);
2059164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
2060164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
2061cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                } else {
2062cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    Slog.w(TAG, "Cloning proc state: no package state " + commonProc.mPackage
2063cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                            + "/" + uid + " for proc " + commonProc.mName);
2064cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
2065cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // And now make a fresh new process state for the new package name.
20668472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                ps = new ProcessState(commonProc, packageName, uid, vers, processName, now);
2067164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
2068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2069d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
2070d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // The common process is for multiple packages, we need to create a
2071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // separate object for the per-package data.
20728472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            ps = new ProcessState(commonProc, packageName, uid, vers, processName,
2073d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    SystemClock.uptimeMillis());
2074164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
2075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pkgState.mProcesses.put(processName, ps);
2077164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps);
2078d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return ps;
2079d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2080d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
20818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn    public ProcessStats.ServiceState getServiceStateLocked(String packageName, int uid, int vers,
208260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            String processName, String className) {
20838472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid, vers);
208460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        ProcessStats.ServiceState ss = as.mServices.get(className);
208560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        if (ss != null) {
2086164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss);
208760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            return ss;
208860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
208960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        final ProcessStats.ProcessState ps = processName != null
20908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                ? getProcessStateLocked(packageName, uid, vers, processName) : null;
2091be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        ss = new ProcessStats.ServiceState(this, packageName, className, processName, ps);
209260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        as.mServices.put(className, ss);
2093164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps);
209460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        return ss;
209560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
209660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
2097cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    private void dumpProcessInternalLocked(PrintWriter pw, String prefix, ProcessState proc,
2098cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            boolean dumpAll) {
2099cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        if (dumpAll) {
2100cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            pw.print(prefix); pw.print("myID=");
2101cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    pw.print(Integer.toHexString(System.identityHashCode(proc)));
2102cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    pw.print(" mCommonProcess=");
2103cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    pw.print(Integer.toHexString(System.identityHashCode(proc.mCommonProcess)));
2104cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    pw.print(" mPackage="); pw.println(proc.mPackage);
2105cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (proc.mMultiPackage) {
2106cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                pw.print(prefix); pw.print("mMultiPackage="); pw.println(proc.mMultiPackage);
2107cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2108cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (proc != proc.mCommonProcess) {
2109cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                pw.print(prefix); pw.print("Common Proc: "); pw.print(proc.mCommonProcess.mName);
2110cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        pw.print("/"); pw.print(proc.mCommonProcess.mUid);
2111cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        pw.print(" pkg="); pw.println(proc.mCommonProcess.mPackage);
2112cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2113cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2114237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn        if (proc.mActive) {
2115237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print(prefix); pw.print("mActive="); pw.println(proc.mActive);
2116237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn        }
2117cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        if (proc.mDead) {
2118cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            pw.print(prefix); pw.print("mDead="); pw.println(proc.mDead);
2119cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2120237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn        if (proc.mNumActiveServices != 0 || proc.mNumStartedServices != 0) {
2121237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print(prefix); pw.print("mNumActiveServices="); pw.print(proc.mNumActiveServices);
2122237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    pw.print(" mNumStartedServices=");
2123237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    pw.println(proc.mNumStartedServices);
2124237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn        }
2125cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    }
2126cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
212753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn    public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary,
2128164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            boolean dumpAll, boolean activeOnly) {
2129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
2130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartTime, now);
2131ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        boolean sepNeeded = false;
2132f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        if (mSysMemUsageTable != null) {
2133f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.println("System memory usage:");
2134f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            dumpSysMemUsage(pw, "  ", ALL_SCREEN_ADJ, ALL_MEM_ADJ);
2135ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            sepNeeded = true;
2136f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
21378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
2138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean printedHeader = false;
2139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
2140daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            final String pkgName = pkgMap.keyAt(ip);
21418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
2142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
2143daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                final int uid = uids.keyAt(iu);
21448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
21458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                for (int iv=0; iv<vpkgs.size(); iv++) {
21468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int vers = vpkgs.keyAt(iv);
21478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final PackageState pkgState = vpkgs.valueAt(iv);
21488472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NPROCS = pkgState.mProcesses.size();
21498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NSRVS = pkgState.mServices.size();
21508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName);
21518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    if (!pkgMatch) {
21528472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        boolean procMatch = false;
21538472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        for (int iproc=0; iproc<NPROCS; iproc++) {
21548472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            ProcessState proc = pkgState.mProcesses.valueAt(iproc);
21558472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (reqPackage.equals(proc.mName)) {
21568472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                procMatch = true;
21578472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                break;
21588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            }
21598472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
21608472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (!procMatch) {
21618472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            continue;
2162daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        }
2163daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    }
21648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    if (NPROCS > 0 || NSRVS > 0) {
21658472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (!printedHeader) {
2166ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                            if (sepNeeded) pw.println();
21678472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.println("Per-Package Stats:");
21688472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            printedHeader = true;
21698472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            sepNeeded = true;
21708472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
21718472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        pw.print("  * "); pw.print(pkgName); pw.print(" / ");
21728472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                UserHandle.formatUid(pw, uid); pw.print(" / v");
21738472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                pw.print(vers); pw.println(":");
2174daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    }
21758472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    if (!dumpSummary || dumpAll) {
21768472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        for (int iproc=0; iproc<NPROCS; iproc++) {
21778472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            ProcessState proc = pkgState.mProcesses.valueAt(iproc);
21788472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (!pkgMatch && !reqPackage.equals(proc.mName)) {
21798472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                continue;
21808472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            }
21818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (activeOnly && !proc.isInUse()) {
21828472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                pw.print("      (Not active: ");
21838472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                        pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")");
21848472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                continue;
21858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            }
21868472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print("      Process ");
21878472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(pkgState.mProcesses.keyAt(iproc));
21888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (proc.mCommonProcess.mMultiPackage) {
21898472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                pw.print(" (multi, ");
21908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            } else {
21918472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                pw.print(" (unique, ");
21928472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            }
21938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(proc.mDurationsTableSize);
21948472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(" entries)");
21958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.println(":");
21968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            dumpProcessState(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
21978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                    ALL_PROC_STATES, now);
21988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            dumpProcessPss(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
21998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                    ALL_PROC_STATES);
22008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            dumpProcessInternalLocked(pw, "        ", proc, dumpAll);
22018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
22028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    } else {
22038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ArrayList<ProcessState> procs = new ArrayList<ProcessState>();
22048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        for (int iproc=0; iproc<NPROCS; iproc++) {
22058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            ProcessState proc = pkgState.mProcesses.valueAt(iproc);
22068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (!pkgMatch && !reqPackage.equals(proc.mName)) {
22078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                continue;
22088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            }
22098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (activeOnly && !proc.isInUse()) {
22108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                continue;
22118472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            }
22128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            procs.add(proc);
22138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
22148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpProcessSummaryLocked(pw, "      ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
22158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                NON_CACHED_PROC_STATES, false, now, totalTime);
2216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
22178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int isvc=0; isvc<NSRVS; isvc++) {
22188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ServiceState svc = pkgState.mServices.valueAt(isvc);
22198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (!pkgMatch && !reqPackage.equals(svc.mProcessName)) {
2220daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                            continue;
2221daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        }
22228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (activeOnly && !svc.isInUse()) {
2223164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            pw.print("      (Not active: ");
22248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                    pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")");
2225164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            continue;
2226164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
22278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (dumpAll) {
22288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print("      Service ");
2229daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        } else {
22308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print("      * ");
2231daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        }
22328472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        pw.print(pkgState.mServices.keyAt(isvc));
2233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println(":");
22348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        pw.print("        Process: "); pw.println(svc.mProcessName);
22358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpServiceStats(pw, "        ", "          ", "    ", "Running", svc,
22368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mRunCount, ServiceState.SERVICE_RUN, svc.mRunState,
22378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mRunStartTime, now, totalTime, !dumpSummary || dumpAll);
22388472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpServiceStats(pw, "        ", "          ", "    ", "Started", svc,
22398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mStartedCount, ServiceState.SERVICE_STARTED, svc.mStartedState,
22408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mStartedStartTime, now, totalTime, !dumpSummary || dumpAll);
22418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpServiceStats(pw, "        ", "          ", "      ", "Bound", svc,
22428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mBoundCount, ServiceState.SERVICE_BOUND, svc.mBoundState,
22438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mBoundStartTime, now, totalTime, !dumpSummary || dumpAll);
22448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpServiceStats(pw, "        ", "          ", "  ", "Executing", svc,
22458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState,
22468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mExecStartTime, now, totalTime, !dumpSummary || dumpAll);
22478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (dumpAll) {
22488472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (svc.mOwner != null) {
22498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                pw.print("        mOwner="); pw.println(svc.mOwner);
22508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            }
22518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            if (svc.mStarted || svc.mRestarting) {
22528472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                pw.print("        mStarted="); pw.print(svc.mStarted);
22538472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                pw.print(" mRestarting="); pw.println(svc.mRestarting);
22548472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            }
2255daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        }
2256be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    }
2257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2261daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
2262daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        printedHeader = false;
2263daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        int numShownProcs = 0, numTotalProcs = 0;
2264daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        for (int ip=0; ip<procMap.size(); ip++) {
2265daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            String procName = procMap.keyAt(ip);
2266daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
2267daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
2268daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                int uid = uids.keyAt(iu);
2269daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                numTotalProcs++;
2270daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                ProcessState proc = uids.valueAt(iu);
2271daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (proc.mDurationsTableSize == 0 && proc.mCurState == STATE_NOTHING
2272daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        && proc.mPssTableSize == 0) {
2273daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    continue;
2274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2275daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (!proc.mMultiPackage) {
2276daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    continue;
2277daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
2278daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (reqPackage != null && !reqPackage.equals(procName)
2279daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        && !reqPackage.equals(proc.mPackage)) {
2280daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    continue;
2281daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
2282daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                numShownProcs++;
2283daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (sepNeeded) {
2284daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    pw.println();
2285daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
2286daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                sepNeeded = true;
2287daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (!printedHeader) {
2288daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    pw.println("Multi-Package Common Processes:");
2289daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    printedHeader = true;
2290daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
2291daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (activeOnly && !proc.isInUse()) {
2292daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    pw.print("      (Not active: "); pw.print(procName); pw.println(")");
2293daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    continue;
2294daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                }
2295daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                pw.print("  * "); pw.print(procName); pw.print(" / ");
2296daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        UserHandle.formatUid(pw, uid);
2297daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        pw.print(" ("); pw.print(proc.mDurationsTableSize);
2298daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        pw.print(" entries)"); pw.println(":");
2299daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                dumpProcessState(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
2300daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        ALL_PROC_STATES, now);
2301daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                dumpProcessPss(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
2302daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        ALL_PROC_STATES);
2303daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                dumpProcessInternalLocked(pw, "        ", proc, dumpAll);
2304d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2305daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
2306daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        if (dumpAll) {
2307daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            pw.println();
2308daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            pw.print("  Total procs: "); pw.print(numShownProcs);
2309daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total");
2310daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
2311d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2312daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        if (sepNeeded) {
2313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
2314daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
2315daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        if (dumpSummary) {
2316daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            pw.println("Summary:");
2317daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            dumpSummaryLocked(pw, reqPackage, now, activeOnly);
2318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
2319d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpTotalsLocked(pw, now);
2320d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (dumpAll) {
2323d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
2324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println("Internal state:");
2325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("  Num long arrays: "); pw.println(mLongs.size());
2326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("  Next long entry: "); pw.println(mNextLong);
2327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("  mRunning="); pw.println(mRunning);
2328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
233169cb00b8dda60eff7449b69723f4e73a28e944f8Dianne Hackborn    public static long dumpSingleServiceTime(PrintWriter pw, String prefix, ServiceState service,
2332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int serviceType, int curState, long curStartTime, long now) {
2333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
2334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
2335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
2336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
2337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
2338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int state = imem+iscreen;
2339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long time = service.getDuration(serviceType, curState, curStartTime,
2340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        state, now);
2341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                String running = "";
23428a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                if (curState == state && pw != null) {
23438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    running = " (running)";
2344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (time != 0) {
2346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (pw != null) {
2347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
2348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printScreenLabel(pw, printedScreen != iscreen
2349d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ? iscreen : STATE_NOTHING);
2350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedScreen = iscreen;
2351237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0);
2352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedMem = imem;
2353237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        pw.print(": ");
2354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        TimeUtils.formatDuration(time, pw); pw.println(running);
2355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
2356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    totalTime += time;
2357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2358d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totalTime != 0 && pw != null) {
2361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
2362237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn            pw.print("    TOTAL: ");
2363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            TimeUtils.formatDuration(totalTime, pw);
2364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
2365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return totalTime;
2367d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void dumpServiceStats(PrintWriter pw, String prefix, String prefixInner,
2370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String headerPrefix, String header, ServiceState service,
2371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int count, int serviceType, int state, long startTime, long now, long totalTime,
2372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean dumpAll) {
2373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (count != 0) {
2374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (dumpAll) {
2375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(prefix); pw.print(header);
2376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" op count "); pw.print(count); pw.println(":");
2377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                dumpSingleServiceTime(pw, prefixInner, service, serviceType, state, startTime,
2378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        now);
2379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
2380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long myTime = dumpSingleServiceTime(null, null, service, serviceType, state,
2381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        startTime, now);
2382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(prefix); pw.print(headerPrefix); pw.print(header);
2383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" count "); pw.print(count);
2384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" / time ");
2385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printPercent(pw, (double)myTime/(double)totalTime);
2386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println();
2387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2391164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn    public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) {
2392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
2393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartTime, now);
2394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpFilteredSummaryLocked(pw, null, "  ", ALL_SCREEN_ADJ, ALL_MEM_ADJ,
2395164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly);
2396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpTotalsLocked(pw, now);
2398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2400f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    long printMemoryCategory(PrintWriter pw, String prefix, String label, double memWeight,
2401f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            long totalTime, long curTotalMem, int samples) {
2402f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        if (memWeight != 0) {
2403f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            long mem = (long)(memWeight * 1024 / totalTime);
2404f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(prefix);
2405f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(label);
2406f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(": ");
2407b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            DebugUtils.printSizeValue(pw, mem);
2408f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(" (");
2409f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(samples);
2410f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(" samples)");
2411f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.println();
2412f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            return curTotalMem + mem;
2413f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
2414f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        return curTotalMem;
2415f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
2416f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
2417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void dumpTotalsLocked(PrintWriter pw, long now) {
2418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println("Run time Stats:");
2419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpSingleTime(pw, "  ", mMemFactorDurations, mMemFactor, mStartTime, now);
2420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2421f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.println("Memory usage:");
2422f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ,
2423f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                ALL_MEM_ADJ);
2424f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        computeTotalMemoryUse(totalMem, now);
2425f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        long totalPss = 0;
2426f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        totalPss = printMemoryCategory(pw, "  ", "Kernel ", totalMem.sysMemKernelWeight,
2427f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                totalMem.totalTime, totalPss, totalMem.sysMemSamples);
2428f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        totalPss = printMemoryCategory(pw, "  ", "Native ", totalMem.sysMemNativeWeight,
2429f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                totalMem.totalTime, totalPss, totalMem.sysMemSamples);
2430f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int i=0; i<STATE_COUNT; i++) {
2431f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            // Skip restarting service state -- that is not actually a running process.
2432f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            if (i != STATE_SERVICE_RESTARTING) {
2433f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                totalPss = printMemoryCategory(pw, "  ", STATE_NAMES[i],
2434f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        totalMem.processStateWeight[i], totalMem.totalTime, totalPss,
2435f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        totalMem.processStateSamples[i]);
2436f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            }
2437f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
2438f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        totalPss = printMemoryCategory(pw, "  ", "Cached ", totalMem.sysMemCachedWeight,
2439f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                totalMem.totalTime, totalPss, totalMem.sysMemSamples);
2440f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        totalPss = printMemoryCategory(pw, "  ", "Free   ", totalMem.sysMemFreeWeight,
2441f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                totalMem.totalTime, totalPss, totalMem.sysMemSamples);
2442d052a9416ae3f7e42fc1e7de0740021df385ee48Dianne Hackborn        totalPss = printMemoryCategory(pw, "  ", "Z-Ram  ", totalMem.sysMemZRamWeight,
2443f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                totalMem.totalTime, totalPss, totalMem.sysMemSamples);
2444f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print("  TOTAL  : ");
2445b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        DebugUtils.printSizeValue(pw, totalPss);
2446f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.println();
2447f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        printMemoryCategory(pw, "  ", STATE_NAMES[STATE_SERVICE_RESTARTING],
2448f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                totalMem.processStateWeight[STATE_SERVICE_RESTARTING], totalMem.totalTime, totalPss,
2449f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                totalMem.processStateSamples[STATE_SERVICE_RESTARTING]);
2450f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.println();
2451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("          Start time: ");
2452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock));
2453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("  Total elapsed time: ");
2455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        TimeUtils.formatDuration(
2456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime)
2457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        - mTimePeriodStartRealtime, pw);
2458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean partial = true;
2459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SHUTDOWN) != 0) {
2460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (shutdown)");
2461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SYSPROPS) != 0) {
2464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (sysprops)");
2465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2466d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_COMPLETE) != 0) {
2468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (complete)");
2469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (partial) {
2472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (partial)");
2473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(' ');
2475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(mRuntime);
2476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix,
2480cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            int[] screenStates, int[] memStates, int[] procStates,
2481164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) {
2482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates,
2483164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                procStates, sortProcStates, now, reqPackage, activeOnly);
2484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (procs.size() > 0) {
2485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (header != null) {
2486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println();
2487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println(header);
2488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2489cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates,
24908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    sortProcStates, true, now, totalTime);
2491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates,
2495164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            int[] procStates, int sortProcStates[], long now, String reqPackage,
2496164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            boolean activeOnly) {
2497daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>();
24988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
2499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
2500daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            final String pkgName = pkgMap.keyAt(ip);
25018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<SparseArray<PackageState>> procs = pkgMap.valueAt(ip);
2502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<procs.size(); iu++) {
25038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final SparseArray<PackageState> vpkgs = procs.valueAt(iu);
25048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final int NVERS = vpkgs.size();
25058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                for (int iv=0; iv<NVERS; iv++) {
25068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final PackageState state = vpkgs.valueAt(iv);
25078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NPROCS = state.mProcesses.size();
25088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName);
25098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
25108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        final ProcessState proc = state.mProcesses.valueAt(iproc);
25118472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (!pkgMatch && !reqPackage.equals(proc.mName)) {
25128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            continue;
25138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
25148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (activeOnly && !proc.isInUse()) {
25158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            continue;
25168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
25178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        foundProcs.add(proc.mCommonProcess);
2518164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
2519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size());
2523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<foundProcs.size(); i++) {
2524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = foundProcs.valueAt(i);
2525164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (computeProcessTimeLocked(proc, screenStates, memStates, procStates, now) > 0) {
2526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                outProcs.add(proc);
2527cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (procStates != sortProcStates) {
2528cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    computeProcessTimeLocked(proc, screenStates, memStates, sortProcStates, now);
2529cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
2530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        Collections.sort(outProcs, new Comparator<ProcessState>() {
2533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            @Override
2534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            public int compare(ProcessState lhs, ProcessState rhs) {
2535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) {
2536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return -1;
2537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) {
2538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return 1;
2539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return 0;
2541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        });
2543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return outProcs;
2544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    String collapseString(String pkgName, String itemName) {
2547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (itemName.startsWith(pkgName)) {
2548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int ITEMLEN = itemName.length();
2549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int PKGLEN = pkgName.length();
2550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (ITEMLEN == PKGLEN) {
2551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return "";
2552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else if (ITEMLEN >= PKGLEN) {
2553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (itemName.charAt(PKGLEN) == '.') {
2554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return itemName.substring(PKGLEN);
2555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return itemName;
2559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void dumpCheckinLocked(PrintWriter pw, String reqPackage) {
2562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final long now = SystemClock.uptimeMillis();
25638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
2564f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.println("vers,5");
2565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("period,"); pw.print(mTimePeriodStartClockStr);
2566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(",");
2567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime);
2568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean partial = true;
2569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SHUTDOWN) != 0) {
2570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",shutdown");
2571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SYSPROPS) != 0) {
2574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",sysprops");
2575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_COMPLETE) != 0) {
2578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",complete");
2579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
2580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (partial) {
2582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",partial");
2583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2585f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print("config,"); pw.println(mRuntime);
2586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
25878472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final String pkgName = pkgMap.keyAt(ip);
2588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (reqPackage != null && !reqPackage.equals(pkgName)) {
2589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                continue;
2590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
25918472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
2592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
25938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final int uid = uids.keyAt(iu);
25948472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
25958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                for (int iv=0; iv<vpkgs.size(); iv++) {
25968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int vers = vpkgs.keyAt(iv);
25978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final PackageState pkgState = vpkgs.valueAt(iv);
25988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NPROCS = pkgState.mProcesses.size();
25998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    final int NSRVS = pkgState.mServices.size();
26008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
26018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ProcessState proc = pkgState.mProcesses.valueAt(iproc);
26028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        pw.print("pkgproc,");
2603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(pkgName);
2604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
2605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(uid);
2606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
26078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        pw.print(vers);
2608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
2609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
26108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpAllProcessStateCheckin(pw, proc, now);
2611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println();
26128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (proc.mPssTableSize > 0) {
26138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print("pkgpss,");
26148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(pkgName);
26158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(uid);
26178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(vers);
26198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
26218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            dumpAllProcessPssCheckin(pw, proc);
26228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.println();
26238472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
26248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0
26258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                || proc.mNumCachedKill > 0) {
26268472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print("pkgkills,");
26278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(pkgName);
26288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26298472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(uid);
26308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26318472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(vers);
26328472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26338472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
26348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(proc.mNumExcessiveWake);
26368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(proc.mNumExcessiveCpu);
26388472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(proc.mNumCachedKill);
26408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(",");
26418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(proc.mMinCachedKillPss);
26428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(":");
26438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(proc.mAvgCachedKillPss);
26448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(":");
26458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.print(proc.mMaxCachedKillPss);
26468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            pw.println();
26478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        }
26488472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    }
26498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    for (int isvc=0; isvc<NSRVS; isvc++) {
26508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        String serviceName = collapseString(pkgName,
26518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                pkgState.mServices.keyAt(isvc));
26528472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        ServiceState svc = pkgState.mServices.valueAt(isvc);
26538472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpServiceTimeCheckin(pw, "pkgsvc-run", pkgName, uid, vers, serviceName,
26548472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc, ServiceState.SERVICE_RUN, svc.mRunCount,
26558472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mRunState, svc.mRunStartTime, now);
26568472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpServiceTimeCheckin(pw, "pkgsvc-start", pkgName, uid, vers, serviceName,
26578472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc, ServiceState.SERVICE_STARTED, svc.mStartedCount,
26588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mStartedState, svc.mStartedStartTime, now);
26598472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpServiceTimeCheckin(pw, "pkgsvc-bound", pkgName, uid, vers, serviceName,
26608472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc, ServiceState.SERVICE_BOUND, svc.mBoundCount,
26618472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mBoundState, svc.mBoundStartTime, now);
26628472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        dumpServiceTimeCheckin(pw, "pkgsvc-exec", pkgName, uid, vers, serviceName,
26638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc, ServiceState.SERVICE_EXEC, svc.mExecCount,
26648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                                svc.mExecState, svc.mExecStartTime, now);
2665d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
2666d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
2671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<procMap.size(); ip++) {
2672d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String procName = procMap.keyAt(ip);
2673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
2674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
2675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = uids.keyAt(iu);
2676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ProcessState procState = uids.valueAt(iu);
2677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (procState.mDurationsTableSize > 0) {
2678d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("proc,");
2679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procName);
2680d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
2682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpAllProcessStateCheckin(pw, procState, now);
2683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
2684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (procState.mPssTableSize > 0) {
2686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("pss,");
2687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procName);
2688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
2690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpAllProcessPssCheckin(pw, procState);
2691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
2692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
26933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0
26943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        || procState.mNumCachedKill > 0) {
2695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("kills,");
2696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procName);
2697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
2699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procState.mNumExcessiveWake);
2701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
2702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procState.mNumExcessiveCpu);
27033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(",");
27043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(procState.mNumCachedKill);
27053bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(",");
27063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(procState.mMinCachedKillPss);
27073bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(":");
27083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(procState.mAvgCachedKillPss);
27093bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(":");
27103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    pw.print(procState.mMaxCachedKillPss);
2711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
2712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("total");
2716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor,
2717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartTime, now);
2718fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn        pw.println();
2719f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        if (mSysMemUsageTable != null) {
2720f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print("sysmemusage");
2721f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            for (int i=0; i<mSysMemUsageTableSize; i++) {
2722f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                int off = mSysMemUsageTable[i];
2723f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
2724f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                pw.print(",");
2725f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                printProcStateTag(pw, type);
2726f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                for (int j=SYS_MEM_USAGE_SAMPLE_COUNT; j<SYS_MEM_USAGE_COUNT; j++) {
2727f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    if (j > SYS_MEM_USAGE_CACHED_MINIMUM) {
2728f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                        pw.print(":");
2729f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    }
2730f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    pw.print(getLong(off, j));
2731f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                }
2732f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            }
2733f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
2734f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.println();
2735f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ,
2736f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                ALL_MEM_ADJ);
2737f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        computeTotalMemoryUse(totalMem, now);
2738f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print("weights,");
2739f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.totalTime);
2740f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(",");
2741f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemCachedWeight);
2742f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(":");
2743f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemSamples);
2744f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(",");
2745f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemFreeWeight);
2746f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(":");
2747f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemSamples);
2748f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(",");
2749f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemZRamWeight);
2750f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(":");
2751f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemSamples);
2752f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(",");
2753f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemKernelWeight);
2754f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(":");
2755f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemSamples);
2756f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(",");
2757f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemNativeWeight);
2758f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(":");
2759f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        pw.print(totalMem.sysMemSamples);
2760f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        for (int i=0; i<STATE_COUNT; i++) {
2761f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(",");
2762f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(totalMem.processStateWeight[i]);
2763f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(":");
2764f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            pw.print(totalMem.processStateSamples[i]);
2765f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
2766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
2767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2769cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    public static class DurationsTable {
27708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final ProcessStats mStats;
2771cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public final String mName;
2772cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public int[] mDurationsTable;
2773cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public int mDurationsTableSize;
2774cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2775cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public DurationsTable(ProcessStats stats, String name) {
2776cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mStats = stats;
2777cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mName = name;
2778cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2779cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2780cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void copyDurationsTo(DurationsTable other) {
2781cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (mDurationsTable != null) {
2782cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mStats.mAddLongTable = new int[mDurationsTable.length];
2783cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mStats.mAddLongTableSize = 0;
2784cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                for (int i=0; i<mDurationsTableSize; i++) {
2785cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    int origEnt = mDurationsTable[i];
2786cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
2787cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    int newOff = mStats.addLongData(i, type, 1);
2788cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    mStats.mAddLongTable[i] = newOff | type;
2789cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    mStats.setLong(newOff, 0, mStats.getLong(origEnt, 0));
2790cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
2791cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                other.mDurationsTable = mStats.mAddLongTable;
2792cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                other.mDurationsTableSize = mStats.mAddLongTableSize;
2793cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            } else {
2794cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                other.mDurationsTable = null;
2795cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                other.mDurationsTableSize = 0;
2796cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2797cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2798cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2799cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void addDurations(DurationsTable other) {
2800cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            for (int i=0; i<other.mDurationsTableSize; i++) {
2801cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                int ent = other.mDurationsTable[i];
2802cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
2803cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (DEBUG) Slog.d(TAG, "Adding state " + state + " duration "
2804cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        + other.mStats.getLong(ent, 0));
2805cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(state, other.mStats.getLong(ent, 0));
2806cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2807cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2808cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2809cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void resetDurationsSafely() {
2810cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mDurationsTable = null;
2811cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mDurationsTableSize = 0;
2812cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2813cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2814cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void writeDurationsToParcel(Parcel out) {
2815cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            out.writeInt(mDurationsTableSize);
2816cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            for (int i=0; i<mDurationsTableSize; i++) {
2817164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": "
2818cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        + printLongOffset(mDurationsTable[i]));
2819cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                out.writeInt(mDurationsTable[i]);
2820cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2821cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2822cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2823cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        boolean readDurationsFromParcel(Parcel in) {
2824cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mDurationsTable = mStats.readTableFromParcel(in, mName, "durations");
2825cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (mDurationsTable == BAD_TABLE) {
2826cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                return false;
2827cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2828cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0;
2829cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            return true;
2830cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2831cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2832cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        void addDuration(int state, long dur) {
2833cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
2834cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            int off;
2835cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (idx >= 0) {
2836cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                off = mDurationsTable[idx];
2837cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            } else {
2838cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mStats.mAddLongTable = mDurationsTable;
2839cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mStats.mAddLongTableSize = mDurationsTableSize;
2840cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                off = mStats.addLongData(~idx, state, 1);
2841cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mDurationsTable = mStats.mAddLongTable;
2842cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mDurationsTableSize = mStats.mAddLongTableSize;
2843cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
2844cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
2845cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (DEBUG) Slog.d(TAG, "Duration of " + mName + " state " + state + " inc by " + dur
2846cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    + " from " + longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK]);
2847cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += dur;
2848cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2849cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2850cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        long getDuration(int state, long now) {
2851cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
2852cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            return idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0;
2853cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        }
2854cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    }
2855cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
2856f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    final public static class ProcessStateHolder {
2857f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public final int appVersion;
2858f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public ProcessStats.ProcessState state;
2859f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
2860f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public ProcessStateHolder(int _appVersion) {
2861f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            appVersion = _appVersion;
2862f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
2863f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
2864f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
2865cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    public static final class ProcessState extends DurationsTable {
28668472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        public ProcessState mCommonProcess;
28678a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final String mPackage;
28688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final int mUid;
28698472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        public final int mVersion;
2870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        //final long[] mDurations = new long[STATE_COUNT*ADJ_COUNT];
2872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mCurState = STATE_NOTHING;
2873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mStartTime;
2874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mLastPssState = STATE_NOTHING;
2876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mLastPssTime;
2877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int[] mPssTable;
2878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mPssTableSize;
2879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2880be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        boolean mActive;
2881be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        int mNumActiveServices;
2882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mNumStartedServices;
2883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mNumExcessiveWake;
2885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mNumExcessiveCpu;
2886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
28873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        int mNumCachedKill;
28883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        long mMinCachedKillPss;
28893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        long mAvgCachedKillPss;
28903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        long mMaxCachedKillPss;
28913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
2892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean mMultiPackage;
289350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        boolean mDead;
2894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
28958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long mTmpTotalTime;
28968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        int mTmpNumInUse;
28978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        ProcessState mTmpFoundSubProc;
2898d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /**
2900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * Create a new top-level process state, for the initial case where there is only
2901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * a single package running in a process.  The initial state is not running.
2902d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         */
29038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        public ProcessState(ProcessStats processStats, String pkg, int uid, int vers, String name) {
2904cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            super(processStats, name);
2905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess = this;
2906d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPackage = pkg;
2907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mUid = uid;
29088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            mVersion = vers;
2909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2910d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /**
2912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * Create a new per-package process state for an existing top-level process
2913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * state.  The current running state of the top-level process is also copied,
2914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * marked as started running at 'now'.
2915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         */
29168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        public ProcessState(ProcessState commonProcess, String pkg, int uid, int vers, String name,
2917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long now) {
2918cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            super(commonProcess.mStats, name);
2919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess = commonProcess;
2920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPackage = pkg;
2921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mUid = uid;
29228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            mVersion = vers;
2923d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCurState = commonProcess.mCurState;
2924d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
2925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState clone(String pkg, long now) {
29288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn            ProcessState pnew = new ProcessState(this, pkg, mUid, mVersion, mName, now);
2929cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            copyDurationsTo(pnew);
2930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mPssTable != null) {
29318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStats.mAddLongTable = new int[mPssTable.length];
29328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStats.mAddLongTableSize = 0;
2933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int i=0; i<mPssTableSize; i++) {
2934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int origEnt = mPssTable[i];
2935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
29368a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    int newOff = mStats.addLongData(i, type, PSS_COUNT);
29378a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    mStats.mAddLongTable[i] = newOff | type;
2938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int j=0; j<PSS_COUNT; j++) {
29398a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                        mStats.setLong(newOff, j, mStats.getLong(origEnt, j));
2940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
2941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
29428a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                pnew.mPssTable = mStats.mAddLongTable;
29438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                pnew.mPssTableSize = mStats.mAddLongTableSize;
2944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pnew.mNumExcessiveWake = mNumExcessiveWake;
2946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pnew.mNumExcessiveCpu = mNumExcessiveCpu;
29473bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pnew.mNumCachedKill = mNumCachedKill;
29483bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pnew.mMinCachedKillPss = mMinCachedKillPss;
29493bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pnew.mAvgCachedKillPss = mAvgCachedKillPss;
29503bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            pnew.mMaxCachedKillPss = mMaxCachedKillPss;
2951be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            pnew.mActive = mActive;
2952164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            pnew.mNumActiveServices = mNumActiveServices;
2953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pnew.mNumStartedServices = mNumStartedServices;
2954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return pnew;
2955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
295760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void add(ProcessState other) {
2958cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            addDurations(other);
295960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int i=0; i<other.mPssTableSize; i++) {
296060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int ent = other.mPssTable[i];
296160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
296260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                addPss(state, (int) other.mStats.getLong(ent, PSS_SAMPLE_COUNT),
296360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_MINIMUM),
296460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_AVERAGE),
296560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_MAXIMUM),
296660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_USS_MINIMUM),
296760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_USS_AVERAGE),
296860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_USS_MAXIMUM));
296960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
297060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mNumExcessiveWake += other.mNumExcessiveWake;
297160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mNumExcessiveCpu += other.mNumExcessiveCpu;
29723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (other.mNumCachedKill > 0) {
29733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss,
29743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        other.mAvgCachedKillPss, other.mMaxCachedKillPss);
29753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
297660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
297760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
2978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void resetSafely(long now) {
2979cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            resetDurationsSafely();
2980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
2981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssState = STATE_NOTHING;
2982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssTime = 0;
2983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPssTable = null;
2984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPssTableSize = 0;
2985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveWake = 0;
2986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveCpu = 0;
29873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            mNumCachedKill = 0;
29883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
2989d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2990d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
299150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        void makeDead() {
299250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            mDead = true;
299350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        }
299450ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn
299550ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        private void ensureNotDead() {
299650ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            if (!mDead) {
299750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                return;
299850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            }
2999164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            Slog.wtfStack(TAG, "ProcessState dead: name=" + mName
300050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                    + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName);
300150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn        }
300250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn
3003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void writeToParcel(Parcel out, long now) {
3004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mMultiPackage ? 1 : 0);
3005cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            writeDurationsToParcel(out);
3006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mPssTableSize);
3007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int i=0; i<mPssTableSize; i++) {
3008164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": "
3009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + printLongOffset(mPssTable[i]));
3010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(mPssTable[i]);
3011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3012d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mNumExcessiveWake);
3013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mNumExcessiveCpu);
30143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            out.writeInt(mNumCachedKill);
30153bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (mNumCachedKill > 0) {
30163bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                out.writeLong(mMinCachedKillPss);
30173bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                out.writeLong(mAvgCachedKillPss);
30183bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                out.writeLong(mMaxCachedKillPss);
30193bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
3020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean readFromParcel(Parcel in, boolean fully) {
3023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean multiPackage = in.readInt() != 0;
3024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (fully) {
3025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mMultiPackage = multiPackage;
3026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3027164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table...");
3028cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (!readDurationsFromParcel(in)) {
3029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return false;
3030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3031164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table...");
30328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            mPssTable = mStats.readTableFromParcel(in, mName, "pss");
3033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mPssTable == BAD_TABLE) {
3034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return false;
3035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPssTableSize = mPssTable != null ? mPssTable.length : 0;
3037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveWake = in.readInt();
3038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveCpu = in.readInt();
30393bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            mNumCachedKill = in.readInt();
30403bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (mNumCachedKill > 0) {
30413bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMinCachedKillPss = in.readLong();
30423bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mAvgCachedKillPss = in.readLong();
30433bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMaxCachedKillPss = in.readLong();
30443bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            } else {
30453bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
30463bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
3047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return true;
3048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3050be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public void makeActive() {
305150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
3052be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mActive = true;
3053be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
3054be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
3055be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public void makeInactive() {
3056be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mActive = false;
3057be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
3058be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
3059be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public boolean isInUse() {
306050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            return mActive || mNumActiveServices > 0 || mNumStartedServices > 0
306150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                    || mCurState != STATE_NOTHING;
3062be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
3063be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
3064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /**
3065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * Update the current state of the given list of processes.
3066d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         *
3067d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param state Current ActivityManager.PROCESS_STATE_*
3068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param memFactor Current mem factor constant.
3069d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param now Current time.
3070d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param pkgList Processes to update.
3071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         */
3072d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setState(int state, int memFactor, long now,
3073f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                ArrayMap<String, ProcessStateHolder> pkgList) {
3074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (state < 0) {
3075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                state = mNumStartedServices > 0
3076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING;
3077d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
3078d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT);
3079d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3080d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3081d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // First update the common process.
3082d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess.setState(state, now);
3083d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3084d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // If the common process is not multi-package, there is nothing else to do.
3085d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
3086d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
3087d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3088d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3089d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (pkgList != null) {
3090d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=pkgList.size()-1; ip>=0; ip--) {
3091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pullFixedProc(pkgList, ip).setState(state, now);
3092d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3093d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3095d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3096d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void setState(int state, long now) {
309750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
3098d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState != state) {
3099d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state);
3100d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                commitStateTime(now);
3101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mCurState = state;
3102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void commitStateTime(long now) {
3106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState != STATE_NOTHING) {
3107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long dur = now - mStartTime;
3108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (dur > 0) {
310960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    addDuration(mCurState, dur);
3110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
3113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3115164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        void incActiveServices(String serviceName) {
3116164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG && "".equals(mName)) {
3117164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                RuntimeException here = new RuntimeException("here");
3118164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                here.fillInStackTrace();
3119164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName
3120164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        + " to " + (mNumActiveServices+1), here);
3121164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            }
3122be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mCommonProcess != this) {
3123164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mCommonProcess.incActiveServices(serviceName);
3124be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
3125be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mNumActiveServices++;
3126be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
3127be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
3128164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        void decActiveServices(String serviceName) {
3129164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (DEBUG && "".equals(mName)) {
3130164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                RuntimeException here = new RuntimeException("here");
3131164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                here.fillInStackTrace();
3132164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName
3133164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        + " to " + (mNumActiveServices-1), here);
3134164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            }
3135be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mCommonProcess != this) {
3136164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mCommonProcess.decActiveServices(serviceName);
3137be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
3138be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mNumActiveServices--;
3139be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mNumActiveServices < 0) {
3140164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage
3141164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        + " uid=" + mUid + " proc=" + mName + " service=" + serviceName);
3142164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mNumActiveServices = 0;
3143be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
3144be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
3145be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
3146daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        void incStartedServices(int memFactor, long now, String serviceName) {
3147daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            if (false) {
3148daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                RuntimeException here = new RuntimeException("here");
3149daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                here.fillInStackTrace();
3150daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                Slog.d(TAG, "incStartedServices: " + this + " service=" + serviceName
3151daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        + " to " + (mNumStartedServices+1), here);
3152daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            }
3153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCommonProcess != this) {
3154daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                mCommonProcess.incStartedServices(memFactor, now, serviceName);
3155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumStartedServices++;
3157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) {
3158daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                setState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now);
3159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3162daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        void decStartedServices(int memFactor, long now, String serviceName) {
3163daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            if (false) {
3164daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                RuntimeException here = new RuntimeException("here");
3165daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                here.fillInStackTrace();
3166daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName
3167daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        + " to " + (mNumStartedServices-1), here);
3168daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            }
3169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCommonProcess != this) {
3170daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                mCommonProcess.decStartedServices(memFactor, now, serviceName);
3171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumStartedServices--;
3173daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            if (mNumStartedServices == 0 && (mCurState%STATE_COUNT) == STATE_SERVICE_RESTARTING) {
3174daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                setState(STATE_NOTHING, now);
3175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else if (mNumStartedServices < 0) {
3176164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtfStack(TAG, "Proc started services underrun: pkg="
3177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + mPackage + " uid=" + mUid + " name=" + mName);
3178164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mNumStartedServices = 0;
3179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3182cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public void addPss(long pss, long uss, boolean always,
3183f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                ArrayMap<String, ProcessStateHolder> pkgList) {
318450ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
3185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!always) {
3186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mLastPssState == mCurState && SystemClock.uptimeMillis()
3187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        < (mLastPssTime+(30*1000))) {
3188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
3189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssState = mCurState;
3192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssTime = SystemClock.uptimeMillis();
3193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState != STATE_NOTHING) {
3194cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // First update the common process.
3195cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                mCommonProcess.addPss(mCurState, 1, pss, pss, pss, uss, uss, uss);
3196cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
3197cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                // If the common process is not multi-package, there is nothing else to do.
3198cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (!mCommonProcess.mMultiPackage) {
3199cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    return;
3200cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
3201cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn
3202cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                if (pkgList != null) {
3203cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    for (int ip=pkgList.size()-1; ip>=0; ip--) {
3204cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                        pullFixedProc(pkgList, ip).addPss(mCurState, 1,
3205cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                                pss, pss, pss, uss, uss, uss);
3206cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    }
3207cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                }
320860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
320960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
321060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
321160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void addPss(int state, int inCount, long minPss, long avgPss, long maxPss, long minUss,
321260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                long avgUss, long maxUss) {
321360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
321460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int off;
321560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (idx >= 0) {
321660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                off = mPssTable[idx];
321760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            } else {
321860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mStats.mAddLongTable = mPssTable;
321960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mStats.mAddLongTableSize = mPssTableSize;
322060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                off = mStats.addLongData(~idx, state, PSS_COUNT);
322160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mPssTable = mStats.mAddLongTable;
322260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mPssTableSize = mStats.mAddLongTableSize;
322360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
322460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
322560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK;
322660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            long count = longs[idx+PSS_SAMPLE_COUNT];
322760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (count == 0) {
322860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_SAMPLE_COUNT] = inCount;
322960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_MINIMUM] = minPss;
323060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_AVERAGE] = avgPss;
323160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_MAXIMUM] = maxPss;
323260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_MINIMUM] = minUss;
323360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_AVERAGE] = avgUss;
323460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_MAXIMUM] = maxUss;
323560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            } else {
323660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_SAMPLE_COUNT] = count+inCount;
323760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_MINIMUM] > minPss) {
323860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_MINIMUM] = minPss;
3239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
324060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_AVERAGE] = (long)(
324160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        ((longs[idx+PSS_AVERAGE]*(double)count)+(avgPss*(double)inCount))
324260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                / (count+inCount) );
324360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_MAXIMUM] < maxPss) {
324460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_MAXIMUM] = maxPss;
324560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
324660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_USS_MINIMUM] > minUss) {
324760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_USS_MINIMUM] = minUss;
324860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
324960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_AVERAGE] = (long)(
325060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        ((longs[idx+PSS_USS_AVERAGE]*(double)count)+(avgUss*(double)inCount))
325160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                / (count+inCount) );
325260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_USS_MAXIMUM] < maxUss) {
325360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_USS_MAXIMUM] = maxUss;
3254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3258f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public void reportExcessiveWake(ArrayMap<String, ProcessStateHolder> pkgList) {
325950ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
3260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess.mNumExcessiveWake++;
3261d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
3262d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
3263d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3264d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3265d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ip=pkgList.size()-1; ip>=0; ip--) {
3266d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pullFixedProc(pkgList, ip).mNumExcessiveWake++;
3267d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3268d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3270f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public void reportExcessiveCpu(ArrayMap<String, ProcessStateHolder> pkgList) {
327150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            ensureNotDead();
3272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess.mNumExcessiveCpu++;
3273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
3274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
3275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3277d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ip=pkgList.size()-1; ip>=0; ip--) {
3278d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pullFixedProc(pkgList, ip).mNumExcessiveCpu++;
3279d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3280d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3281d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
32823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        private void addCachedKill(int num, long minPss, long avgPss, long maxPss) {
32833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (mNumCachedKill <= 0) {
32843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mNumCachedKill = num;
32853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMinCachedKillPss = minPss;
32863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mAvgCachedKillPss = avgPss;
32873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mMaxCachedKillPss = maxPss;
32883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            } else {
32893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                if (minPss < mMinCachedKillPss) {
32903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    mMinCachedKillPss = minPss;
32913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                }
32923bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                if (maxPss > mMaxCachedKillPss) {
32933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    mMaxCachedKillPss = maxPss;
32943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                }
32953bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mAvgCachedKillPss = (long)( ((mAvgCachedKillPss*(double)mNumCachedKill) + avgPss)
32963bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                        / (mNumCachedKill+num) );
32973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                mNumCachedKill += num;
32983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
32993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
33003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
3301f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public void reportCachedKill(ArrayMap<String, ProcessStateHolder> pkgList, long pss) {
33023bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            ensureNotDead();
33033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            mCommonProcess.addCachedKill(1, pss, pss, pss);
33043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
33053bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                return;
33063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
33073bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
33083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            for (int ip=pkgList.size()-1; ip>=0; ip--) {
33093bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                pullFixedProc(pkgList, ip).addCachedKill(1, pss, pss, pss);
33103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
33113bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
33123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
3313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState pullFixedProc(String pkgName) {
3314d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mMultiPackage) {
3315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // The array map is still pointing to a common process state
3316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // that is now shared across packages.  Update it to point to
3317d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // the new per-package state.
33188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgName, mUid);
33198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                if (vpkg == null) {
33208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    throw new IllegalStateException("Didn't find package " + pkgName
33218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            + " / " + mUid);
33228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                }
33238472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                PackageState pkg = vpkg.get(mVersion);
33248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                if (pkg == null) {
33258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    throw new IllegalStateException("Didn't find package " + pkgName
33268472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            + " / " + mUid + " vers " + mVersion);
33278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                }
33288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                ProcessState proc = pkg.mProcesses.get(mName);
3329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (proc == null) {
33308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    throw new IllegalStateException("Didn't create per-package process "
33318472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            + mName + " in pkg " + pkgName + " / " + mUid + " vers " + mVersion);
3332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return proc;
3334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return this;
3336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3338f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        private ProcessState pullFixedProc(ArrayMap<String, ProcessStateHolder> pkgList,
3339f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                int index) {
3340f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            ProcessStateHolder holder = pkgList.valueAt(index);
3341f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            ProcessState proc = holder.state;
334250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            if (mDead && proc.mCommonProcess != proc) {
334353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn                // Somehow we are contining to use a process state that is dead, because
334450ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                // it was not being told it was active during the last commit.  We can recover
334550ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                // from this by generating a fresh new state, but this is bad because we
334650ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                // are losing whatever data we had in the old process state.
334750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                Log.wtf(TAG, "Pulling dead proc: name=" + mName + " pkg=" + mPackage
334850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn                        + " uid=" + mUid + " common.name=" + mCommonProcess.mName);
33498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                proc = mStats.getProcessStateLocked(proc.mPackage, proc.mUid, proc.mVersion,
33508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        proc.mName);
335150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn            }
3352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (proc.mMultiPackage) {
3353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // The array map is still pointing to a common process state
3354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // that is now shared across packages.  Update it to point to
3355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // the new per-package state.
33568472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgList.keyAt(index),
33578472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                        proc.mUid);
33588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                if (vpkg == null) {
3359a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn                    throw new IllegalStateException("No existing package "
3360164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            + pkgList.keyAt(index) + "/" + proc.mUid
3361164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            + " for multi-proc " + proc.mName);
3362a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn                }
33638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                PackageState pkg = vpkg.get(proc.mVersion);
33648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                if (pkg == null) {
33658472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                    throw new IllegalStateException("No existing package "
33668472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            + pkgList.keyAt(index) + "/" + proc.mUid
33678472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                            + " for multi-proc " + proc.mName + " version " + proc.mVersion);
33688472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn                }
3369a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn                proc = pkg.mProcesses.get(proc.mName);
3370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (proc == null) {
3371164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    throw new IllegalStateException("Didn't create per-package process "
3372164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            + proc.mName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid);
3373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3374f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                holder.state = proc;
3375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return proc;
3377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getDuration(int state, long now) {
3380cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            long time = super.getDuration(state, now);
3381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState == state) {
3382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - mStartTime;
3383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return time;
3385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssSampleCount(int state) {
3388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
33898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_SAMPLE_COUNT) : 0;
3390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssMinimum(int state) {
3393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
33948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MINIMUM) : 0;
3395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssAverage(int state) {
3398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
33998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_AVERAGE) : 0;
3400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssMaximum(int state) {
3403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
34048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MAXIMUM) : 0;
3405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssUssMinimum(int state) {
3408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
34098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MINIMUM) : 0;
3410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssUssAverage(int state) {
3413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
34148a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_AVERAGE) : 0;
3415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssUssMaximum(int state) {
3418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
34198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0;
3420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3421164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn
3422164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        public String toString() {
3423164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            StringBuilder sb = new StringBuilder(128);
3424164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this)))
3425164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    .append(" ").append(mName).append("/").append(mUid)
3426164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    .append(" pkg=").append(mPackage);
3427164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mMultiPackage) sb.append(" (multi)");
3428164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mCommonProcess != this) sb.append(" (sub)");
3429164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            sb.append("}");
3430164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            return sb.toString();
3431164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        }
3432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
3433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3434cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn    public static final class ServiceState extends DurationsTable {
343569cb00b8dda60eff7449b69723f4e73a28e944f8Dianne Hackborn        public final String mPackage;
3436be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public final String mProcessName;
3437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState mProc;
3438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3439164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        Object mOwner;
3440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3441be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public static final int SERVICE_RUN = 0;
3442be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public static final int SERVICE_STARTED = 1;
3443be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public static final int SERVICE_BOUND = 2;
3444be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public static final int SERVICE_EXEC = 3;
3445be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        static final int SERVICE_COUNT = 4;
3446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3447be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        int mRunCount;
3448be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public int mRunState = STATE_NOTHING;
3449be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        long mRunStartTime;
3450be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
3451daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        boolean mStarted;
3452daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        boolean mRestarting;
3453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mStartedCount;
3454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public int mStartedState = STATE_NOTHING;
3455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mStartedStartTime;
3456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mBoundCount;
3458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public int mBoundState = STATE_NOTHING;
3459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mBoundStartTime;
3460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mExecCount;
3462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public int mExecState = STATE_NOTHING;
3463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mExecStartTime;
3464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3465be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public ServiceState(ProcessStats processStats, String pkg, String name,
3466be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                String processName, ProcessState proc) {
3467cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            super(processStats, name);
3468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPackage = pkg;
3469be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mProcessName = processName;
3470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mProc = proc;
3471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3473164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        public void applyNewOwner(Object newOwner) {
3474164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner != newOwner) {
3475164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                if (mOwner == null) {
3476164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    mOwner = newOwner;
3477164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    mProc.incActiveServices(mName);
3478164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                } else {
3479164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    // There was already an old owner, reset this object for its
3480164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    // new owner.
3481164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    mOwner = newOwner;
3482daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) {
3483164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        long now = SystemClock.uptimeMillis();
3484daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        if (mStarted) {
3485164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
3486164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + " from " + mOwner + " while started: pkg="
3487164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + mPackage + " service=" + mName + " proc=" + mProc);
3488164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            setStarted(false, 0, now);
3489164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
3490164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (mBoundState != STATE_NOTHING) {
3491164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
3492164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + " from " + mOwner + " while bound: pkg="
3493164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + mPackage + " service=" + mName + " proc=" + mProc);
3494164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            setBound(false, 0, now);
3495164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
3496164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        if (mExecState != STATE_NOTHING) {
3497164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
3498164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + " from " + mOwner + " while executing: pkg="
3499164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                                    + mPackage + " service=" + mName + " proc=" + mProc);
3500164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                            setExecuting(false, 0, now);
3501164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        }
3502164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
3503164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                }
3504be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
3505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3507878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn        public void clearCurrentOwner(Object owner, boolean silently) {
3508164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner == owner) {
3509164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                mProc.decActiveServices(mName);
3510daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) {
3511164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    long now = SystemClock.uptimeMillis();
3512daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                    if (mStarted) {
3513878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        if (!silently) {
3514878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                            Slog.wtfStack(TAG, "Service owner " + owner
3515878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + " cleared while started: pkg=" + mPackage + " service="
3516878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + mName + " proc=" + mProc);
3517878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        }
3518164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        setStarted(false, 0, now);
3519164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
3520164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (mBoundState != STATE_NOTHING) {
3521878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        if (!silently) {
3522878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                            Slog.wtfStack(TAG, "Service owner " + owner
3523878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + " cleared while bound: pkg=" + mPackage + " service="
3524878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + mName + " proc=" + mProc);
3525878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        }
3526164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        setBound(false, 0, now);
3527164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
3528164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    if (mExecState != STATE_NOTHING) {
3529878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        if (!silently) {
3530878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                            Slog.wtfStack(TAG, "Service owner " + owner
3531878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + " cleared while exec: pkg=" + mPackage + " service="
3532878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                                    + mName + " proc=" + mProc);
3533878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                        }
3534164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                        setExecuting(false, 0, now);
3535164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    }
3536164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                }
3537878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn                mOwner = null;
3538be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
3539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3541be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public boolean isInUse() {
3542dfc60ec523674ac5c72fd88a23999e80b2dd72d1Dianne Hackborn            return mOwner != null || mRestarting;
3543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
354525e1ecaabbde4741663c8e5a777d9df9b939572cDianne Hackborn        public boolean isRestarting() {
354625e1ecaabbde4741663c8e5a777d9df9b939572cDianne Hackborn            return mRestarting;
354725e1ecaabbde4741663c8e5a777d9df9b939572cDianne Hackborn        }
354825e1ecaabbde4741663c8e5a777d9df9b939572cDianne Hackborn
354960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void add(ServiceState other) {
3550cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            addDurations(other);
3551be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mRunCount += other.mRunCount;
355260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mStartedCount += other.mStartedCount;
355360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mBoundCount += other.mBoundCount;
355460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mExecCount += other.mExecCount;
355560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
355660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
3557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void resetSafely(long now) {
3558cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            resetDurationsSafely();
3559be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mRunCount = mRunState != STATE_NOTHING ? 1 : 0;
3560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0;
3561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0;
3562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mExecCount = mExecState != STATE_NOTHING ? 1 : 0;
3563cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mRunStartTime = mStartedStartTime = mBoundStartTime = mExecStartTime = now;
3564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void writeToParcel(Parcel out, long now) {
3567cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            writeDurationsToParcel(out);
3568be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            out.writeInt(mRunCount);
3569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mStartedCount);
3570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mBoundCount);
3571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mExecCount);
3572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean readFromParcel(Parcel in) {
3575cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (!readDurationsFromParcel(in)) {
3576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return false;
3577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3578be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mRunCount = in.readInt();
3579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartedCount = in.readInt();
3580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mBoundCount = in.readInt();
3581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mExecCount = in.readInt();
3582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return true;
3583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
35858a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        void commitStateTime(long now) {
3586be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mRunState != STATE_NOTHING) {
3587cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT), now - mRunStartTime);
3588be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                mRunStartTime = now;
3589be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
35908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            if (mStartedState != STATE_NOTHING) {
3591cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT),
359260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        now - mStartedStartTime);
35938a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStartedStartTime = now;
35948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
35958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            if (mBoundState != STATE_NOTHING) {
3596cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), now - mBoundStartTime);
35978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mBoundStartTime = now;
35988a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
35998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            if (mExecState != STATE_NOTHING) {
3600cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime);
36018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mExecStartTime = now;
36028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
36038a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        }
36048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
3605be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        private void updateRunning(int memFactor, long now) {
3606be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            final int state = (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING
3607be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    || mExecState != STATE_NOTHING) ? memFactor : STATE_NOTHING;
3608be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (mRunState != state) {
3609be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                if (mRunState != STATE_NOTHING) {
3610cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT),
3611be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                            now - mRunStartTime);
3612be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                } else if (state != STATE_NOTHING) {
3613be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                    mRunCount++;
3614be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                }
3615be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                mRunState = state;
3616be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                mRunStartTime = now;
3617be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
3618be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
3619be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
3620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setStarted(boolean started, int memFactor, long now) {
3621164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner == null) {
3622164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtf(TAG, "Starting service " + this + " without owner");
3623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3624daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            mStarted = started;
3625daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            updateStartedState(memFactor, now);
3626daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
3627daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn
3628daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        public void setRestarting(boolean restarting, int memFactor, long now) {
3629daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            mRestarting = restarting;
3630daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            updateStartedState(memFactor, now);
3631daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        }
3632daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn
3633daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn        void updateStartedState(int memFactor, long now) {
3634ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn            final boolean wasStarted = mStartedState != STATE_NOTHING;
3635daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn            final boolean started = mStarted || mRestarting;
3636ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn            final int state = started ? memFactor : STATE_NOTHING;
3637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mStartedState != state) {
3638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mStartedState != STATE_NOTHING) {
3639cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT),
364060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            now - mStartedStartTime);
3641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (started) {
3642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mStartedCount++;
3643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartedState = state;
3645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartedStartTime = now;
3646ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn                mProc = mProc.pullFixedProc(mPackage);
3647ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn                if (wasStarted != started) {
3648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (started) {
3649daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        mProc.incStartedServices(memFactor, now, mName);
3650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
3651daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn                        mProc.decStartedServices(memFactor, now, mName);
3652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
3653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3654be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                updateRunning(memFactor, now);
3655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setBound(boolean bound, int memFactor, long now) {
3659164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner == null) {
3660164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtf(TAG, "Binding service " + this + " without owner");
3661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3662ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn            final int state = bound ? memFactor : STATE_NOTHING;
3663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mBoundState != state) {
3664d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mBoundState != STATE_NOTHING) {
3665cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT),
366660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            now - mBoundStartTime);
3667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (bound) {
3668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mBoundCount++;
3669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mBoundState = state;
3671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mBoundStartTime = now;
3672be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                updateRunning(memFactor, now);
3673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setExecuting(boolean executing, int memFactor, long now) {
3677164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            if (mOwner == null) {
3678164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                Slog.wtf(TAG, "Executing service " + this + " without owner");
3679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3680ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn            final int state = executing ? memFactor : STATE_NOTHING;
3681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mExecState != state) {
3682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mExecState != STATE_NOTHING) {
3683cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                    addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime);
3684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (executing) {
3685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mExecCount++;
3686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mExecState = state;
3688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mExecStartTime = now;
3689be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                updateRunning(memFactor, now);
3690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        private long getDuration(int opType, int curState, long startTime, int memFactor,
3694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long now) {
3695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int state = opType + (memFactor*SERVICE_COUNT);
3696cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            long time = getDuration(state, now);
3697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (curState == memFactor) {
3698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - startTime;
3699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return time;
3701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3702164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn
3703164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        public String toString() {
3704164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn            return "ServiceState{" + Integer.toHexString(System.identityHashCode(this))
3705164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    + " " + mName + " pkg=" + mPackage + " proc="
3706164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn                    + Integer.toHexString(System.identityHashCode(this)) + "}";
3707164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn        }
3708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
3709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final class PackageState {
3711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public final ArrayMap<String, ProcessState> mProcesses
3712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                = new ArrayMap<String, ProcessState>();
3713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public final ArrayMap<String, ServiceState> mServices
3714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                = new ArrayMap<String, ServiceState>();
3715cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public final String mPackageName;
3716cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public final int mUid;
3717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3718cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn        public PackageState(String packageName, int uid) {
3719d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mUid = uid;
3720cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            mPackageName = packageName;
3721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
3723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
37248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final class ProcessDataCollection {
3725d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] screenStates;
3726d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] memStates;
3727d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] procStates;
3728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
37298a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long totalTime;
37308a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long numPss;
37318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long minPss;
37328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long avgPss;
37338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long maxPss;
37348a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long minUss;
37358a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long avgUss;
37368a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long maxUss;
3737d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
37388a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) {
3739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            screenStates = _screenStates;
3740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            memStates = _memStates;
3741d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            procStates = _procStates;
3742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3744d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void print(PrintWriter pw, long overallTime, boolean full) {
3745cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            if (totalTime > overallTime) {
3746cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn                pw.print("*");
3747cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn            }
3748d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printPercent(pw, (double) totalTime / (double) overallTime);
3749d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (numPss > 0) {
3750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" (");
3751b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                DebugUtils.printSizeValue(pw, minPss * 1024);
3752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
3753b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                DebugUtils.printSizeValue(pw, avgPss * 1024);
3754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
3755b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                DebugUtils.printSizeValue(pw, maxPss * 1024);
3756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("/");
3757b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                DebugUtils.printSizeValue(pw, minUss * 1024);
3758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
3759b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                DebugUtils.printSizeValue(pw, avgUss * 1024);
3760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
3761b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                DebugUtils.printSizeValue(pw, maxUss * 1024);
3762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (full) {
3763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(" over ");
3764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(numPss);
3765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
3766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(")");
3767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
3768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
3769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
3770f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
3771f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    public static class TotalMemoryUseCollection {
3772f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        final int[] screenStates;
3773f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        final int[] memStates;
3774f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
3775f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public TotalMemoryUseCollection(int[] _screenStates, int[] _memStates) {
3776f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            screenStates = _screenStates;
3777f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            memStates = _memStates;
3778f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        }
3779f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
3780f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public long totalTime;
3781f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public long[] processStatePss = new long[STATE_COUNT];
3782f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public double[] processStateWeight = new double[STATE_COUNT];
3783f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public long[] processStateTime = new long[STATE_COUNT];
3784f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public int[] processStateSamples = new int[STATE_COUNT];
3785f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public long[] sysMemUsage = new long[SYS_MEM_USAGE_COUNT];
3786f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public double sysMemCachedWeight;
3787f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public double sysMemFreeWeight;
3788f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public double sysMemZRamWeight;
3789f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public double sysMemKernelWeight;
3790f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public double sysMemNativeWeight;
3791f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        public int sysMemSamples;
3792f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
3793d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn}
3794