ProcessStats.java revision dfc60ec523674ac5c72fd88a23999e80b2dd72d1
101f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka/*
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2013 The Android Open Source Project
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License.
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License.
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectpackage com.android.internal.app;
18a5902524d4403885eb4c50360bf3465c6be796efJoe Onorato
1931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.os.Parcel;
20dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.os.Parcelable;
218edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurkaimport android.os.SystemClock;
22dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.os.SystemProperties;
232801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohenimport android.os.UserHandle;
242801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohenimport android.text.format.DateFormat;
25dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.util.ArrayMap;
26946ad470c72a3caa7568d11836c182b7f84d840dMichael Jurkaimport android.util.ArraySet;
2731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.Log;
2831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.Slog;
2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.SparseArray;
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.TimeUtils;
31af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.webkit.WebViewFactory;
32af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport com.android.internal.util.ArrayUtils;
3331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport dalvik.system.VMRuntime;
342ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato
3568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport java.io.IOException;
3668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport java.io.InputStream;
37c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandlerimport java.io.PrintWriter;
381e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkeyimport java.util.ArrayList;
3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.util.Arrays;
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.util.Collections;
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.util.Comparator;
42f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chungimport java.util.Objects;
43716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen
44aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungpublic final class ProcessStats implements Parcelable {
4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static final String TAG = "ProcessStats";
46f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    static final boolean DEBUG = false;
47716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen    static final boolean DEBUG_PARCEL = false;
4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
49138a04170d964da9cdec228e95b976875ae52481Karl Rosaen    public static final String SERVICE_NAME = "procstats";
50ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler
511e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey    // How often the service commits its data, giving the minimum batching
5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    // that is done.
53a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy    public static long COMMIT_PERIOD = 3*60*60*1000;  // Commit current stats every 3 hours
54af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka
55ff0c2e26ecf3e27571743fb6d11128e948dd91f3Romain Guy    public static final int STATE_NOTHING = -1;
56af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka    public static final int STATE_PERSISTENT = 0;
57c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler    public static final int STATE_TOP = 1;
58319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick    public static final int STATE_IMPORTANT_FOREGROUND = 2;
5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int STATE_IMPORTANT_BACKGROUND = 3;
600fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer    public static final int STATE_BACKUP = 4;
611e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey    public static final int STATE_HEAVY_WEIGHT = 5;
62ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    public static final int STATE_SERVICE = 6;
63843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler    public static final int STATE_SERVICE_RESTARTING = 7;
64be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato    public static final int STATE_RECEIVER = 8;
654ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy    public static final int STATE_HOME = 9;
666d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani    public static final int STATE_LAST_ACTIVITY = 10;
6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int STATE_CACHED_ACTIVITY = 11;
6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int STATE_CACHED_ACTIVITY_CLIENT = 12;
6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int STATE_CACHED_EMPTY = 13;
7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int STATE_COUNT = STATE_CACHED_EMPTY+1;
717c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato
72400438b79fe412cb625c96297edeea9c6155349eWinson Chung    public static final int PSS_SAMPLE_COUNT = 0;
730d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato    public static final int PSS_MINIMUM = 1;
7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int PSS_AVERAGE = 2;
7531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int PSS_MAXIMUM = 3;
7631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int PSS_USS_MINIMUM = 4;
7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int PSS_USS_AVERAGE = 5;
780e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka    public static final int PSS_USS_MAXIMUM = 6;
79400438b79fe412cb625c96297edeea9c6155349eWinson Chung    public static final int PSS_COUNT = PSS_USS_MAXIMUM+1;
8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
81716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen    public static final int ADJ_NOTHING = -1;
82e0f5a61a1f105216b0067124bacac69194c0ef70Michael Jurka    public static final int ADJ_MEM_FACTOR_NORMAL = 0;
83860f4c5a82d4b3c8d5444f986176a9af6f085df7Adam Cohen    public static final int ADJ_MEM_FACTOR_MODERATE = 1;
84815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov    public static final int ADJ_MEM_FACTOR_LOW = 2;
85f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen    public static final int ADJ_MEM_FACTOR_CRITICAL = 3;
8631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1;
87ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT;
8831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int ADJ_SCREEN_OFF = 0;
898a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy    public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD;
90e6b8e2fa73b5b2e8e3adfa9ea1b4ca9659e10686Romain Guy    public static final int ADJ_COUNT = ADJ_SCREEN_ON*2;
91af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka
9268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung    public static final int FLAG_COMPLETE = 1<<0;
9368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung    public static final int FLAG_SHUTDOWN = 1<<1;
944ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy    public static final int FLAG_SYSPROPS = 1<<2;
95df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen
96df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen    public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL,
97d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka            ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL };
98edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy
99c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen    public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON };
100c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen
101c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen    public static final int[] NON_CACHED_PROC_STATES = new int[] {
102c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen            STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND,
103c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen            STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT,
104c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen            STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER
105c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen    };
106c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen
10731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final int[] BACKGROUND_PROC_STATES = new int[] {
10831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP,
10931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER
110946ad470c72a3caa7568d11836c182b7f84d840dMichael Jurka    };
1110e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka
1120e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka    // Map from process states to the states we track.
113a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato    static final int[] PROCESS_STATE_TO_STATE = new int[] {
114cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato            STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT
11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT_UI
1169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            STATE_TOP,                      // ActivityManager.PROCESS_STATE_TOP
117843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler            STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
1186fefcf1f83ba05e898ea7164a68dcced657bb43eRomain Guy            STATE_IMPORTANT_BACKGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            STATE_BACKUP,                   // ActivityManager.PROCESS_STATE_BACKUP
1202d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato            STATE_HEAVY_WEIGHT,             // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
1212d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato            STATE_SERVICE,                  // ActivityManager.PROCESS_STATE_SERVICE
12231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            STATE_RECEIVER,                 // ActivityManager.PROCESS_STATE_RECEIVER
1237ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung            STATE_HOME,                     // ActivityManager.PROCESS_STATE_HOME
1247ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung            STATE_LAST_ACTIVITY,            // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
12531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            STATE_CACHED_ACTIVITY,          // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
12631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            STATE_CACHED_ACTIVITY_CLIENT,   // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
12794dabf1be48001ea2a8fcb496fe08ba82b229e00Romain Guy            STATE_CACHED_EMPTY,             // ActivityManager.PROCESS_STATE_CACHED_EMPTY
12831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    };
12931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1307376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project    public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT,
13131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP,
13231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER,
1337376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project            STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY,
134a0618e4102d0543d953d81e162d93c8ea641d0fdMike Cleron            STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY
13531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    };
13631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
13731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static final String[] STATE_NAMES = new String[] {
1383a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron            "Persist", "Top    ", "ImpFg  ", "ImpBg  ",
1393a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron            "Backup ", "HeavyWt", "Service", "ServRst",
14031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            "Receivr", "Home   ",
1417c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato            "LastAct", "CchAct ", "CchCAct", "CchEmty"
1427c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato    };
14331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
14498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy    public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] {
14531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            "off", "on"
14631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    };
14731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
148883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka    public static final String[] ADJ_MEM_NAMES_CSV = new String[] {
149883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            "norm", "mod",  "low", "crit"
15031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    };
1513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
1523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    public static final String[] STATE_NAMES_CSV = new String[] {
15331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            "pers", "top", "impfg", "impbg", "backup", "heavy",
15431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            "service", "service-rs", "receiver", "home", "lastact",
155fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            "cch-activity", "cch-aclient", "cch-empty"
15631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    };
157fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen
15831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static final String[] ADJ_SCREEN_TAGS = new String[] {
15931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            "0", "1"
16031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    };
16131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
16231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static final String[] ADJ_MEM_TAGS = new String[] {
163ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy            "n", "m",  "l", "c"
164ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy    };
1656b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy
166f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    static final String[] STATE_TAGS = new String[] {
167c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka            "p", "t", "f", "b", "u", "w",
168c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka            "s", "x", "r", "h", "l", "a", "c", "e"
1696b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy    };
1709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
171557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung    static final String CSV_SEP = "\t";
172557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung
17331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    // Current version of the parcel format.
17431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private static final int PARCEL_VERSION = 14;
1753a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
17631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private static final int MAGIC = 0x50535453;
1772ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato
1782ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato    // Where the "type"/"state" part of the data appears in an offset integer.
1791e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey    static int OFFSET_TYPE_SHIFT = 0;
1801e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey    static int OFFSET_TYPE_MASK = 0xff;
18131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    // Where the "which array" part of the data appears in an offset integer.
18231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static int OFFSET_ARRAY_SHIFT = 8;
18300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    static int OFFSET_ARRAY_MASK = 0xff;
18431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    // Where the "index into array" part of the data appears in an offset integer.
185cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy    static int OFFSET_INDEX_SHIFT = 16;
1867376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project    static int OFFSET_INDEX_MASK = 0xffff;
1877376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project
188cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy    public String mReadError;
1893d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    public String mTimePeriodStartClockStr;
1900280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    public int mFlags;
1910280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka
19231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public final ProcessMap<SparseArray<PackageState>> mPackages
19331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            = new ProcessMap<SparseArray<PackageState>>();
1943d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>();
195f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
1963d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    public final long[] mMemFactorDurations = new long[ADJ_COUNT];
1974c98d9235d164680186180974719f551cf935d08Winson Chung    public int mMemFactor = STATE_NOTHING;
198785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung    public long mStartTime;
199785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
200ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    public long mTimePeriodStartClock;
2012b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy    public long mTimePeriodStartRealtime;
20231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public long mTimePeriodEndRealtime;
20331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    String mRuntime;
20431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    String mWebView;
20531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    boolean mRunning;
2069c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
2079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    static final int LONGS_SIZE = 4096;
20834a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato    final ArrayList<long[]> mLongs = new ArrayList<long[]>();
20931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    int mNextLong;
21031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
211ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato    int[] mAddLongTable;
21231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    int mAddLongTableSize;
21331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
21431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    // For writing parcels.
2159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    ArrayMap<String, Integer> mCommonStringToIndex;
2160589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
217d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen    // For reading parcels.
218d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen    ArrayList<String> mIndexToCommonString;
219d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen
2209c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public ProcessStats(boolean running) {
221319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick        mRunning = running;
222319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick        reset();
223319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick    }
224cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy
225c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler    public ProcessStats(Parcel in) {
226ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        reset();
227ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        readFromParcel(in);
228ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler    }
229ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler
230c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler    public void add(ProcessStats other) {
231ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy        ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = other.mPackages.getMap();
232ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy        for (int ip=0; ip<pkgMap.size(); ip++) {
233ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            final String pkgName = pkgMap.keyAt(ip);
234ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
235ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            for (int iu=0; iu<uids.size(); iu++) {
236ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                final int uid = uids.keyAt(iu);
237ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                final SparseArray<PackageState> versions = uids.valueAt(iu);
238ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                for (int iv=0; iv<versions.size(); iv++) {
239ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    final int vers = versions.keyAt(iv);
240ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    final PackageState otherState = versions.valueAt(iv);
241ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    final int NPROCS = otherState.mProcesses.size();
242400438b79fe412cb625c96297edeea9c6155349eWinson Chung                    final int NSRVS = otherState.mServices.size();
243400438b79fe412cb625c96297edeea9c6155349eWinson Chung                    for (int iproc=0; iproc<NPROCS; iproc++) {
244400438b79fe412cb625c96297edeea9c6155349eWinson Chung                        ProcessState otherProc = otherState.mProcesses.valueAt(iproc);
245400438b79fe412cb625c96297edeea9c6155349eWinson Chung                        if (otherProc.mCommonProcess != otherProc) {
2464ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka                            if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid
247e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka                                    + " vers " + vers + " proc " + otherProc.mName);
248e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka                            ProcessState thisProc = getProcessStateLocked(pkgName, uid, vers,
249e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka                                    otherProc.mName);
2504ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka                            if (thisProc.mCommonProcess == thisProc) {
2512801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                                if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting");
2522801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                                thisProc.mMultiPackage = true;
253ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka                                long now = SystemClock.uptimeMillis();
254ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka                                final PackageState pkgState = getPackageStateLocked(pkgName, uid,
255002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                                        vers);
256002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                                thisProc = thisProc.clone(thisProc.mPackage, now);
257002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                                pkgState.mProcesses.put(thisProc.mName, thisProc);
258002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                            }
259002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                            thisProc.add(otherProc);
260002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        }
2613d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    }
262002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                    for (int isvc=0; isvc<NSRVS; isvc++) {
263002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        ServiceState otherSvc = otherState.mServices.valueAt(isvc);
264002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid
265002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                                + " service " + otherSvc.mName);
266002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        ServiceState thisSvc = getServiceStateLocked(pkgName, uid, vers,
26731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                otherSvc.mProcessName, otherSvc.mName);
26831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        thisSvc.add(otherSvc);
26931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    }
2700589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato                }
2710589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            }
2720589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        }
27341a12d225a546b0a193628a4e5dd6b62cc60b7d0Joe Onorato
27431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap();
275cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy        for (int ip=0; ip<procMap.size(); ip++) {
2767376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project            SparseArray<ProcessState> uids = procMap.valueAt(ip);
2777376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project            for (int iu=0; iu<uids.size(); iu++) {
2787376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                int uid = uids.keyAt(iu);
279cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                ProcessState otherProc = uids.valueAt(iu);
28031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                ProcessState thisProc = mProcesses.get(otherProc.mName, uid);
2810fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer                if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + otherProc.mName);
2820fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer                if (thisProc == null) {
28331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    if (DEBUG) Slog.d(TAG, "Creating new process!");
28431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    thisProc = new ProcessState(this, otherProc.mPackage, uid, otherProc.mVersion,
285c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                            otherProc.mName);
28631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    mProcesses.put(otherProc.mName, uid, thisProc);
28731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    PackageState thisState = getPackageStateLocked(otherProc.mPackage, uid,
28831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            otherProc.mVersion);
28931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    if (!thisState.mProcesses.containsKey(otherProc.mName)) {
2901e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                        thisState.mProcesses.put(otherProc.mName, thisProc);
2911e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                    }
2927c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato                }
2937404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato                thisProc.add(otherProc);
29431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
29531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
29631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
297a12a2502e6a448d36ab7b8de46de0c1afe40b34fWinson Chung        for (int i=0; i<ADJ_COUNT; i++) {
298785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by "
299785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                    + other.mMemFactorDurations[i] + " from "
300785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                    + mMemFactorDurations[i]);
301a12a2502e6a448d36ab7b8de46de0c1afe40b34fWinson Chung            mMemFactorDurations[i] += other.mMemFactorDurations[i];
30231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
30331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
30431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (other.mTimePeriodStartClock < mTimePeriodStartClock) {
30531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            mTimePeriodStartClock = other.mTimePeriodStartClock;
30631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            mTimePeriodStartClockStr = other.mTimePeriodStartClockStr;
3079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
30831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime;
30931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
31031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
31131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static final Parcelable.Creator<ProcessStats> CREATOR
31231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            = new Parcelable.Creator<ProcessStats>() {
31334a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato        public ProcessStats createFromParcel(Parcel in) {
31434a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato            return new ProcessStats(in);
31534a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato        }
3164ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka
3174ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka        public ProcessStats[] newArray(int size) {
318f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            return new ProcessStats[size];
319f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
320cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath    };
321f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
322f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    private static void printScreenLabel(PrintWriter pw, int offset) {
323f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        switch (offset) {
324f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            case ADJ_NOTHING:
325f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                pw.print("     ");
326f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                break;
327f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            case ADJ_SCREEN_OFF:
328f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                pw.print("SOff/");
329f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                break;
3304ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka            case ADJ_SCREEN_ON:
33131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.print("SOn /");
332cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                break;
33331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            default:
334319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                pw.print("????/");
335319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                break;
336319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick        }
337319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick    }
338319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick
339319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick    public static void printScreenLabelCsv(PrintWriter pw, int offset) {
340319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick        switch (offset) {
341319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick            case ADJ_NOTHING:
342319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                break;
343319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick            case ADJ_SCREEN_OFF:
344319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                pw.print(ADJ_SCREEN_NAMES_CSV[0]);
345319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                break;
346319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick            case ADJ_SCREEN_ON:
347319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                pw.print(ADJ_SCREEN_NAMES_CSV[1]);
348319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                break;
349319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick            default:
350319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                pw.print("???");
351fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams                break;
35231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
35331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
354319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick
35531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private static void printMemLabel(PrintWriter pw, int offset, char sep) {
35631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        switch (offset) {
357319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick            case ADJ_NOTHING:
35831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.print("    ");
35931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                if (sep != 0) pw.print(' ');
360319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                break;
36131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            case ADJ_MEM_FACTOR_NORMAL:
36231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.print("Norm");
36384f296c106cb1c7b6d3ae6c6d5508a17f1324e29Romain Guy                if (sep != 0) pw.print(sep);
36431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                break;
36584f296c106cb1c7b6d3ae6c6d5508a17f1324e29Romain Guy            case ADJ_MEM_FACTOR_MODERATE:
366319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                pw.print("Mod ");
367319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                if (sep != 0) pw.print(sep);
368319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                break;
36998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            case ADJ_MEM_FACTOR_LOW:
3700589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato                pw.print("Low ");
371c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                if (sep != 0) pw.print(sep);
372319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                break;
373319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick            case ADJ_MEM_FACTOR_CRITICAL:
374319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                pw.print("Crit");
375dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunne                if (sep != 0) pw.print(sep);
376319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                break;
377319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick            default:
378319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                pw.print("????");
379319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                if (sep != 0) pw.print(sep);
38098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                break;
38198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        }
38298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy    }
38398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy
38498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy    public static void printMemLabelCsv(PrintWriter pw, int offset) {
38598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        if (offset >= ADJ_MEM_FACTOR_NORMAL) {
38698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            if (offset <= ADJ_MEM_FACTOR_CRITICAL) {
38798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                pw.print(ADJ_MEM_NAMES_CSV[offset]);
388fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams            } else {
38998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                pw.print("???");
39098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            }
39198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        }
39298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy    }
39398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy
39498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy    public static long dumpSingleTime(PrintWriter pw, String prefix, long[] durations,
39598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            int curState, long curStartTime, long now) {
39698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        long totalTime = 0;
39798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        int printedScreen = -1;
39898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
39998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            int printedMem = -1;
40098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
40198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                int state = imem+iscreen;
40298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                long time = durations[state];
40398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                String running = "";
40498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                if (curState == state) {
40598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                    time += now - curStartTime;
40698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                    if (pw != null) {
40798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                        running = " (running)";
40898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                    }
40998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                }
41098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                if (time != 0) {
41198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                    if (pw != null) {
41298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                        pw.print(prefix);
41398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                        printScreenLabel(pw, printedScreen != iscreen
41498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                                ? iscreen : STATE_NOTHING);
41598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                        printedScreen = iscreen;
41698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                        printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0);
41798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                        printedMem = imem;
41898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                        pw.print(": ");
41998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                        TimeUtils.formatDuration(time, pw); pw.println(running);
42098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                    }
42198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                    totalTime += time;
42298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy                }
42398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            }
42498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        }
42598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        if (totalTime != 0 && pw != null) {
42698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            pw.print(prefix);
42798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            pw.print("    TOTAL: ");
42898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            TimeUtils.formatDuration(totalTime, pw);
42998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy            pw.println();
43098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        }
43198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy        return totalTime;
43231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
43331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
43431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void dumpAdjTimesCheckin(PrintWriter pw, String sep, long[] durations,
435716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen            int curState, long curStartTime, long now) {
436716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
437716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
438716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen                int state = imem+iscreen;
43931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                long time = durations[state];
44031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                if (curState == state) {
44131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    time += now - curStartTime;
44231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                }
44331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                if (time != 0) {
44431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    printAdjTagAndValue(pw, state, time);
44531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                }
44631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
44731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
44831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
44931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
45031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void dumpServiceTimeCheckin(PrintWriter pw, String label, String packageName,
451ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            int uid, int vers, String serviceName, ServiceState svc, int serviceType, int opCount,
452ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            int curState, long curStartTime, long now) {
453ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        if (opCount <= 0) {
454ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            return;
455ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        }
456ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(label);
457ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(",");
458ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(packageName);
459ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(",");
460ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(uid);
461ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(",");
462ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(vers);
463ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(",");
464ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(serviceName);
465c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler        pw.print(",");
466ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.print(opCount);
467ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        boolean didCurState = false;
468ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        for (int i=0; i<svc.mDurationsTableSize; i++) {
469ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            int off = svc.mDurationsTable[i];
470ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
471ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            int memFactor = type / ServiceState.SERVICE_COUNT;
472ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            type %= ServiceState.SERVICE_COUNT;
473ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            if (type != serviceType) {
474ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                continue;
475ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            }
476ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            long time = svc.mStats.getLong(off, 0);
477ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            if (curState == memFactor) {
478ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                didCurState = true;
479ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                time += now - curStartTime;
480ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            }
481ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            printAdjTagAndValue(pw, memFactor, time);
482ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        }
483ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        if (!didCurState && curState != STATE_NOTHING) {
484ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            printAdjTagAndValue(pw, curState, now - curStartTime);
485ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        }
486ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        pw.println();
487ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler    }
488ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler
489ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler    public static void computeProcessData(ProcessState proc, ProcessDataCollection data, long now) {
490ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        data.totalTime = 0;
491c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler        data.numPss = data.minPss = data.avgPss = data.maxPss =
492ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                data.minUss = data.avgUss = data.maxUss = 0;
493ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        for (int is=0; is<data.screenStates.length; is++) {
494ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            for (int im=0; im<data.memStates.length; im++) {
495ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                for (int ip=0; ip<data.procStates.length; ip++) {
496ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT)
497ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            + data.procStates[ip];
498ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    data.totalTime += proc.getDuration(bucket, now);
499ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    long samples = proc.getPssSampleCount(bucket);
500ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    if (samples > 0) {
501ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        long minPss = proc.getPssMinimum(bucket);
502ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        long avgPss = proc.getPssAverage(bucket);
503ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        long maxPss = proc.getPssMaximum(bucket);
504ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        long minUss = proc.getPssUssMinimum(bucket);
505ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        long avgUss = proc.getPssUssAverage(bucket);
506ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        long maxUss = proc.getPssUssMaximum(bucket);
507aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung                        if (data.numPss == 0) {
508ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            data.minPss = minPss;
509ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            data.avgPss = avgPss;
510ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            data.maxPss = maxPss;
511ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            data.minUss = minUss;
512ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            data.avgUss = avgUss;
513ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            data.maxUss = maxUss;
514ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        } else {
515ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            if (minPss < data.minPss) {
516ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                                data.minPss = minPss;
517aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung                            }
518ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            data.avgPss = (long)( ((data.avgPss*(double)data.numPss)
519ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                                    + (avgPss*(double)samples)) / (data.numPss+samples) );
520ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            if (maxPss > data.maxPss) {
521ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                                data.maxPss = maxPss;
522ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            }
523c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                            if (minUss < data.minUss) {
524c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                                data.minUss = minUss;
525aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung                            }
526aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung                            data.avgUss = (long)( ((data.avgUss*(double)data.numPss)
527ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                                    + (avgUss*(double)samples)) / (data.numPss+samples) );
528c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                            if (maxUss > data.maxUss) {
529c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                                data.maxUss = maxUss;
530c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                            }
531ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        }
532ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        data.numPss += samples;
533aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung                    }
534ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                }
535ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            }
536ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        }
537ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler    }
538ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler
539c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler    static long computeProcessTimeLocked(ProcessState proc, int[] screenStates, int[] memStates,
540ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                int[] procStates, long now) {
541ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        long totalTime = 0;
542aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung        /*
543aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung        for (int i=0; i<proc.mDurationsTableSize; i++) {
544ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            int val = proc.mDurationsTable[i];
545ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            totalTime += proc.mState.getLong(val, 0);
546ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            if ((val&0xff) == proc.mCurState) {
547ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                totalTime += now - proc.mStartTime;
548ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            }
549ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        }
550ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        */
551ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        for (int is=0; is<screenStates.length; is++) {
552ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            for (int im=0; im<memStates.length; im++) {
553ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                for (int ip=0; ip<procStates.length; ip++) {
554ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT)
555ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            + procStates[ip];
556ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    totalTime += proc.getDuration(bucket, now);
557ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                }
558ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            }
559aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung        }
560ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        proc.mTmpTotalTime = totalTime;
561ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        return totalTime;
562ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler    }
563ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler
564ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler    static void dumpProcessState(PrintWriter pw, String prefix, ProcessState proc,
565ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            int[] screenStates, int[] memStates, int[] procStates, long now) {
566ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        long totalTime = 0;
567ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        int printedScreen = -1;
568ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler        for (int is=0; is<screenStates.length; is++) {
569ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            int printedMem = -1;
570ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler            for (int im=0; im<memStates.length; im++) {
571ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                for (int ip=0; ip<procStates.length; ip++) {
572ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    final int iscreen = screenStates[is];
573ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    final int imem = memStates[im];
574ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
575ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    long time = proc.getDuration(bucket, now);
576ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    String running = "";
577ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    if (proc.mCurState == bucket) {
578ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        running = " (running)";
579ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    }
580ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                    if (time != 0) {
581c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                        pw.print(prefix);
582c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                        if (screenStates.length > 1) {
583c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                            printScreenLabel(pw, printedScreen != iscreen
584aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung                                    ? iscreen : STATE_NOTHING);
585aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung                            printedScreen = iscreen;
586ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        }
587ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                        if (memStates.length > 1) {
588ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler                            printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/');
589c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                            printedMem = imem;
590c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                        }
591c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                        pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
592c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                        TimeUtils.formatDuration(time, pw); pw.println(running);
593c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                        totalTime += time;
594c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                    }
595c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler                }
596557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung            }
597557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung        }
598557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung        if (totalTime != 0) {
599557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung            pw.print(prefix);
600557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung            if (screenStates.length > 1) {
601002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                printScreenLabel(pw, STATE_NOTHING);
602002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy            }
6033d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            if (memStates.length > 1) {
6043d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                printMemLabel(pw, STATE_NOTHING, '/');
605002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy            }
606002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy            pw.print("TOTAL  : ");
607002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy            TimeUtils.formatDuration(totalTime, pw);
608002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy            pw.println();
609002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy        }
6103d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    }
6113d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
612557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung    static void dumpProcessPss(PrintWriter pw, String prefix, ProcessState proc, int[] screenStates,
613002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy            int[] memStates, int[] procStates) {
614002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy        boolean printedHeader = false;
615002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy        int printedScreen = -1;
616002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy        for (int is=0; is<screenStates.length; is++) {
617002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy            int printedMem = -1;
6183d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            for (int im=0; im<memStates.length; im++) {
619557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                for (int ip=0; ip<procStates.length; ip++) {
620002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                    final int iscreen = screenStates[is];
621002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                    final int imem = memStates[im];
622002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
623002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                    long count = proc.getPssSampleCount(bucket);
624557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                    if (count > 0) {
625002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        if (!printedHeader) {
626002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                            pw.print(prefix);
62731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            pw.print("PSS/USS (");
628002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                            pw.print(proc.mPssTableSize);
629557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                            pw.println(" entries):");
630aad5ef44c665fc4ce143a61c009dc04be3ab0437Romain Guy                            printedHeader = true;
631aad5ef44c665fc4ce143a61c009dc04be3ab0437Romain Guy                        }
63231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        pw.print(prefix);
63331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        pw.print("  ");
634cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                        if (screenStates.length > 1) {
63531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            printScreenLabel(pw, printedScreen != iscreen
63631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                    ? iscreen : STATE_NOTHING);
6373d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                            printedScreen = iscreen;
6383d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        }
639002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        if (memStates.length > 1) {
640002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                            printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/');
641002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                            printedMem = imem;
6423d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        }
6433d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
6443d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        pw.print(count);
6453d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        pw.print(" samples ");
646002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        printSizeValue(pw, proc.getPssMinimum(bucket) * 1024);
647002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        pw.print(" ");
648002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        printSizeValue(pw, proc.getPssAverage(bucket) * 1024);
649002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        pw.print(" ");
650002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        printSizeValue(pw, proc.getPssMaximum(bucket) * 1024);
651557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                        pw.print(" / ");
65231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        printSizeValue(pw, proc.getPssUssMinimum(bucket) * 1024);
65318042c82c5847d3caf9af65583c5590c17927c3dRomain Guy                        pw.print(" ");
654557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                        printSizeValue(pw, proc.getPssUssAverage(bucket) * 1024);
655557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                        pw.print(" ");
656557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                        printSizeValue(pw, proc.getPssUssMaximum(bucket) * 1024);
657557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                        pw.println();
658557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                    }
659557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                }
660557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung            }
66131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
66231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (proc.mNumExcessiveWake != 0) {
663557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung            pw.print(prefix); pw.print("Killed for excessive wake locks: ");
664557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                    pw.print(proc.mNumExcessiveWake); pw.println(" times");
665557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung        }
66631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (proc.mNumExcessiveCpu != 0) {
66731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(prefix); pw.print("Killed for excessive CPU use: ");
66831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    pw.print(proc.mNumExcessiveCpu); pw.println(" times");
66931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
67031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (proc.mNumCachedKill != 0) {
67134a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato            pw.print(prefix); pw.print("Killed from cached state: ");
672ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                    pw.print(proc.mNumCachedKill); pw.print(" times from pss ");
6739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    printSizeValue(pw, proc.mMinCachedKillPss * 1024); pw.print("-");
6749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    printSizeValue(pw, proc.mAvgCachedKillPss * 1024); pw.print("-");
6759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    printSizeValue(pw, proc.mMaxCachedKillPss * 1024); pw.println();
676ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato        }
67731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
678ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka
679ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka    static void dumpStateHeadersCsv(PrintWriter pw, String sep, int[] screenStates,
680ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka            int[] memStates, int[] procStates) {
681ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy        final int NS = screenStates != null ? screenStates.length : 1;
682ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy        final int NM = memStates != null ? memStates.length : 1;
683ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy        final int NP = procStates != null ? procStates.length : 1;
68431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        for (int is=0; is<NS; is++) {
68531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            for (int im=0; im<NM; im++) {
68631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                for (int ip=0; ip<NP; ip++) {
6877376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                    pw.print(sep);
6887376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                    boolean printed = false;
689ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                    if (screenStates != null && screenStates.length > 1) {
69024b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato                        printScreenLabelCsv(pw, screenStates[is]);
6917376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                        printed = true;
692cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                    }
69399c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey                    if (memStates != null && memStates.length > 1) {
69499c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey                        if (printed) {
6959c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                            pw.print("-");
6969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        }
697785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                        printMemLabelCsv(pw, memStates[im]);
698785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                        printed = true;
699785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                    }
70013c2e7b788203f397085bef563bc5597e4c98028Romain Guy                    if (procStates != null && procStates.length > 1) {
70199c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey                        if (printed) {
7027376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                            pw.print("-");
7032d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato                        }
7042d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato                        pw.print(STATE_NAMES_CSV[procStates[ip]]);
7052d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato                    }
7062d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato                }
7072d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato            }
7082d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato        }
7092d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato    }
7102d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato
7112d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato    static void dumpProcessStateCsv(PrintWriter pw, ProcessState proc,
7122d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato            boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
7132d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato            boolean sepProcStates, int[] procStates, long now) {
7142d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato        final int NSS = sepScreenStates ? screenStates.length : 1;
7152d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato        final int NMS = sepMemStates ? memStates.length : 1;
7162d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato        final int NPS = sepProcStates ? procStates.length : 1;
7172d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato        for (int iss=0; iss<NSS; iss++) {
7182d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato            for (int ims=0; ims<NMS; ims++) {
7192d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato                for (int ips=0; ips<NPS; ips++) {
7202d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato                    final int vsscreen = sepScreenStates ? screenStates[iss] : 0;
7212d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato                    final int vsmem = sepMemStates ? memStates[ims] : 0;
7222d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato                    final int vsproc = sepProcStates ? procStates[ips] : 0;
7232d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato                    final int NSA = sepScreenStates ? 1 : screenStates.length;
72431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    final int NMA = sepMemStates ? 1 : memStates.length;
72531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    final int NPA = sepProcStates ? 1 : procStates.length;
72631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    long totalTime = 0;
72731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    for (int isa=0; isa<NSA; isa++) {
72831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        for (int ima=0; ima<NMA; ima++) {
72931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            for (int ipa=0; ipa<NPA; ipa++) {
73031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                final int vascreen = sepScreenStates ? 0 : screenStates[isa];
73131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                final int vamem = sepMemStates ? 0 : memStates[ima];
73297d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung                                final int vaproc = sepProcStates ? 0 : procStates[ipa];
73397d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung                                final int bucket = ((vsscreen + vascreen + vsmem + vamem)
73497d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung                                        * STATE_COUNT) + vsproc + vaproc;
73597d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung                                totalTime += proc.getDuration(bucket, now);
73631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            }
73731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        }
73831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    }
739138a04170d964da9cdec228e95b976875ae52481Karl Rosaen                    pw.print(CSV_SEP);
740cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                    pw.print(totalTime);
741138a04170d964da9cdec228e95b976875ae52481Karl Rosaen                }
742138a04170d964da9cdec228e95b976875ae52481Karl Rosaen            }
743138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        }
744138a04170d964da9cdec228e95b976875ae52481Karl Rosaen    }
745138a04170d964da9cdec228e95b976875ae52481Karl Rosaen
74631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void dumpProcessList(PrintWriter pw, String prefix, ArrayList<ProcessState> procs,
74731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            int[] screenStates, int[] memStates, int[] procStates, long now) {
74831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        String innerPrefix = prefix + "  ";
7498a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato        for (int i=procs.size()-1; i>=0; i--) {
7508a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato            ProcessState proc = procs.get(i);
7518a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato            pw.print(prefix);
7528a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato            pw.print(proc.mName);
7538a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato            pw.print(" / ");
75431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            UserHandle.formatUid(pw, proc.mUid);
75531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(" (");
75631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(proc.mDurationsTableSize);
757138a04170d964da9cdec228e95b976875ae52481Karl Rosaen            pw.print(" entries)");
758138a04170d964da9cdec228e95b976875ae52481Karl Rosaen            pw.println(":");
759138a04170d964da9cdec228e95b976875ae52481Karl Rosaen            dumpProcessState(pw, innerPrefix, proc, screenStates, memStates, procStates, now);
760138a04170d964da9cdec228e95b976875ae52481Karl Rosaen            if (proc.mPssTableSize > 0) {
761138a04170d964da9cdec228e95b976875ae52481Karl Rosaen                dumpProcessPss(pw, innerPrefix, proc, screenStates, memStates, procStates);
762138a04170d964da9cdec228e95b976875ae52481Karl Rosaen            }
763138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        }
764138a04170d964da9cdec228e95b976875ae52481Karl Rosaen    }
765138a04170d964da9cdec228e95b976875ae52481Karl Rosaen
766138a04170d964da9cdec228e95b976875ae52481Karl Rosaen    static void dumpProcessSummaryDetails(PrintWriter pw, ProcessState proc, String prefix,
76731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            String label, int[] screenStates, int[] memStates, int[] procStates,
768883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            long now, long totalTime, boolean full) {
769883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka        ProcessDataCollection totals = new ProcessDataCollection(screenStates,
770883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka                memStates, procStates);
771883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka        computeProcessData(proc, totals, now);
772883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka        if (totals.totalTime != 0 || totals.numPss != 0) {
773883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            if (prefix != null) {
774883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka                pw.print(prefix);
775883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            }
776883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            if (label != null) {
777883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka                pw.print(label);
778883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            }
779883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            totals.print(pw, totalTime, full);
780883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            if (prefix != null) {
781883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka                pw.println();
782883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            }
783883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka        }
78431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
78531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
78631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void dumpProcessSummaryLocked(PrintWriter pw, String prefix,
78731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            ArrayList<ProcessState> procs, int[] screenStates, int[] memStates, int[] procStates,
78831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            boolean inclUidVers, long now, long totalTime) {
78931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        for (int i=procs.size()-1; i>=0; i--) {
79031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            ProcessState proc = procs.get(i);
79131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(prefix);
79231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print("* ");
793883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            pw.print(proc.mName);
794883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka            pw.print(" / ");
795f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            UserHandle.formatUid(pw, proc.mUid);
7963a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato            pw.print(" / v");
7973a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato            pw.print(proc.mVersion);
7983a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato            pw.println(":");
79931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            dumpProcessSummaryDetails(pw, proc, prefix, "         TOTAL: ", screenStates, memStates,
80031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    procStates, now, totalTime, true);
8010142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka            dumpProcessSummaryDetails(pw, proc, prefix, "    Persistent: ", screenStates, memStates,
80231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    new int[] { STATE_PERSISTENT }, now, totalTime, true);
80331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            dumpProcessSummaryDetails(pw, proc, prefix, "           Top: ", screenStates, memStates,
8043d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    new int[] {STATE_TOP}, now, totalTime, true);
8053d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            dumpProcessSummaryDetails(pw, proc, prefix, "        Imp Fg: ", screenStates, memStates,
8063d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true);
8070280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            dumpProcessSummaryDetails(pw, proc, prefix, "        Imp Bg: ", screenStates, memStates,
8083d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true);
8093d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            dumpProcessSummaryDetails(pw, proc, prefix, "        Backup: ", screenStates, memStates,
8103d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    new int[] {STATE_BACKUP}, now, totalTime, true);
8113d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            dumpProcessSummaryDetails(pw, proc, prefix, "     Heavy Wgt: ", screenStates, memStates,
8123d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true);
81331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            dumpProcessSummaryDetails(pw, proc, prefix, "       Service: ", screenStates, memStates,
81431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    new int[] {STATE_SERVICE}, now, totalTime, true);
81531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            dumpProcessSummaryDetails(pw, proc, prefix, "    Service Rs: ", screenStates, memStates,
81631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true);
81731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            dumpProcessSummaryDetails(pw, proc, prefix, "      Receiver: ", screenStates, memStates,
81831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    new int[] {STATE_RECEIVER}, now, totalTime, true);
819319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick            dumpProcessSummaryDetails(pw, proc, prefix, "        (Home): ", screenStates, memStates,
82031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    new int[] {STATE_HOME}, now, totalTime, true);
82131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            dumpProcessSummaryDetails(pw, proc, prefix, "    (Last Act): ", screenStates, memStates,
822a12a2502e6a448d36ab7b8de46de0c1afe40b34fWinson Chung                    new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true);
823785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            dumpProcessSummaryDetails(pw, proc, prefix, "      (Cached): ", screenStates, memStates,
824785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                    new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT,
825785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                            STATE_CACHED_EMPTY}, now, totalTime, true);
826785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        }
827785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung    }
828f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
829785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung    static void printPercent(PrintWriter pw, double fraction) {
830785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        fraction *= 100;
831785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        if (fraction < 1) {
832785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            pw.print(String.format("%.2f", fraction));
833785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        } else if (fraction < 10) {
834785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            pw.print(String.format("%.1f", fraction));
835785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        } else {
836785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            pw.print(String.format("%.0f", fraction));
83731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
83831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        pw.print("%");
83931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
84031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
84131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void printSizeValue(PrintWriter pw, long number) {
84231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        float result = number;
843a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        String suffix = "";
84400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (result > 900) {
8454c98d9235d164680186180974719f551cf935d08Winson Chung            suffix = "KB";
8464c98d9235d164680186180974719f551cf935d08Winson Chung            result = result / 1024;
84731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
8484c98d9235d164680186180974719f551cf935d08Winson Chung        if (result > 900) {
8494c98d9235d164680186180974719f551cf935d08Winson Chung            suffix = "MB";
8504c98d9235d164680186180974719f551cf935d08Winson Chung            result = result / 1024;
8513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        }
8523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        if (result > 900) {
8533d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            suffix = "GB";
8543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            result = result / 1024;
8553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        }
8563d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        if (result > 900) {
8574c98d9235d164680186180974719f551cf935d08Winson Chung            suffix = "TB";
8584c98d9235d164680186180974719f551cf935d08Winson Chung            result = result / 1024;
8594c98d9235d164680186180974719f551cf935d08Winson Chung        }
8604c98d9235d164680186180974719f551cf935d08Winson Chung        if (result > 900) {
861d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka            suffix = "PB";
8624c98d9235d164680186180974719f551cf935d08Winson Chung            result = result / 1024;
863f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
864f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        String value;
865f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (result < 1) {
866f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            value = String.format("%.2f", result);
867f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else if (result < 10) {
868f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            value = String.format("%.1f", result);
869f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else if (result < 100) {
870f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            value = String.format("%.0f", result);
871f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
872f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            value = String.format("%.0f", result);
873f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
874838a4ca645389a1c1fc49e2f1ea0726331b8a538Michael Jurka        pw.print(value);
8753d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        pw.print(suffix);
8764c98d9235d164680186180974719f551cf935d08Winson Chung    }
8774c98d9235d164680186180974719f551cf935d08Winson Chung
8784c98d9235d164680186180974719f551cf935d08Winson Chung    public static void dumpProcessListCsv(PrintWriter pw, ArrayList<ProcessState> procs,
8794c98d9235d164680186180974719f551cf935d08Winson Chung            boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
8804c98d9235d164680186180974719f551cf935d08Winson Chung            boolean sepProcStates, int[] procStates, long now) {
8814c98d9235d164680186180974719f551cf935d08Winson Chung        pw.print("process");
882e0f5a61a1f105216b0067124bacac69194c0ef70Michael Jurka        pw.print(CSV_SEP);
88331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        pw.print("uid");
88431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        pw.print(CSV_SEP);
885c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler        pw.print("vers");
886aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung        dumpStateHeadersCsv(pw, CSV_SEP, sepScreenStates ? screenStates : null,
88731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                sepMemStates ? memStates : null,
88831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                sepProcStates ? procStates : null);
88931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        pw.println();
89031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        for (int i=procs.size()-1; i>=0; i--) {
89131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            ProcessState proc = procs.get(i);
89231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(proc.mName);
89331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(CSV_SEP);
8940589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            UserHandle.formatUid(pw, proc.mUid);
89531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(CSV_SEP);
8960142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka            pw.print(proc.mVersion);
89731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            dumpProcessStateCsv(pw, proc, sepScreenStates, screenStates,
89831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    sepMemStates, memStates, sepProcStates, procStates, now);
89931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.println();
90031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
90131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
90231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
90331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static int printArrayEntry(PrintWriter pw, String[] array, int value, int mod) {
90431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        int index = value/mod;
90531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (index >= 0 && index < array.length) {
90631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(array[index]);
90731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        } else {
9080589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            pw.print('?');
90967b2f6cba5aa7b5d0fac5e66ba8f3d5f887baee6Michael Jurka        }
91067b2f6cba5aa7b5d0fac5e66ba8f3d5f887baee6Michael Jurka        return value - index*mod;
91131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
91231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
91331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void printProcStateTag(PrintWriter pw, int state) {
91431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        state = printArrayEntry(pw, ADJ_SCREEN_TAGS,  state, ADJ_SCREEN_MOD*STATE_COUNT);
91531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        state = printArrayEntry(pw, ADJ_MEM_TAGS,  state, STATE_COUNT);
91631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        printArrayEntry(pw, STATE_TAGS,  state, 1);
91731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
91831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
91931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void printAdjTag(PrintWriter pw, int state) {
92031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        state = printArrayEntry(pw, ADJ_SCREEN_TAGS,  state, ADJ_SCREEN_MOD);
9213d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        printArrayEntry(pw, ADJ_MEM_TAGS, state, 1);
9220280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    }
9233d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
9240280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    static void printProcStateTagAndValue(PrintWriter pw, int state, long value) {
925fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen        pw.print(',');
926fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen        printProcStateTag(pw, state);
927fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen        pw.print(':');
928fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen        pw.print(value);
929fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen    }
9300280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka
9310280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka    static void printAdjTagAndValue(PrintWriter pw, int state, long value) {
9320280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        pw.print(',');
93331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        printAdjTag(pw, state);
934002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy        pw.print(':');
935cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy        pw.print(value);
9360589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    }
9370589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
93831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void dumpAllProcessStateCheckin(PrintWriter pw, ProcessState proc, long now) {
9390589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        boolean didCurState = false;
9403d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        for (int i=0; i<proc.mDurationsTableSize; i++) {
941fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            int off = proc.mDurationsTable[i];
9420589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
9430589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            long time = proc.mStats.getLong(off, 0);
94431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (proc.mCurState == type) {
94531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                didCurState = true;
946cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                time += now - proc.mStartTime;
94731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
94831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            printProcStateTagAndValue(pw, type, time);
94931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
95031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (!didCurState && proc.mCurState != STATE_NOTHING) {
95131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            printProcStateTagAndValue(pw, proc.mCurState, now - proc.mStartTime);
95231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
9533d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    }
9543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
9553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    static void dumpAllProcessPssCheckin(PrintWriter pw, ProcessState proc) {
9563d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        for (int i=0; i<proc.mPssTableSize; i++) {
9573d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            int off = proc.mPssTable[i];
9580280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
959d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            long count = proc.mStats.getLong(off, PSS_SAMPLE_COUNT);
960fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            long min = proc.mStats.getLong(off, PSS_MINIMUM);
961fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            long avg = proc.mStats.getLong(off, PSS_AVERAGE);
962fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            long max = proc.mStats.getLong(off, PSS_MAXIMUM);
963fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            long umin = proc.mStats.getLong(off, PSS_USS_MINIMUM);
964fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            long uavg = proc.mStats.getLong(off, PSS_USS_AVERAGE);
965fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            long umax = proc.mStats.getLong(off, PSS_USS_MAXIMUM);
966fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            pw.print(',');
967d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            printProcStateTag(pw, type);
9683d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            pw.print(':');
969d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            pw.print(count);
970d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            pw.print(':');
971fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            pw.print(min);
972d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            pw.print(':');
973d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            pw.print(avg);
974d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            pw.print(':');
9750280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            pw.print(max);
9760280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            pw.print(':');
9770280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            pw.print(umin);
978cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy            pw.print(':');
9790280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            pw.print(uavg);
9803d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            pw.print(':');
98131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(umax);
98231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
98331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
9843d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
9853d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    public void reset() {
98631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr);
98731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        resetCommon();
98831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mPackages.getMap().clear();
98931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mProcesses.getMap().clear();
9907376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project        mMemFactor = STATE_NOTHING;
99131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mStartTime = 0;
9925bbc91bbbcba6cbcfff66b8d8dd510abb06bc076Romain Guy        if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr);
9937376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project    }
99431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
9953d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    public void resetSafely() {
9967376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project        if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr);
997cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy        resetCommon();
9987376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project
9993d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        // First initialize use count of all common processes.
1000093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen        final long now = SystemClock.uptimeMillis();
1001093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen        final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
1002093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen        for (int ip=procMap.size()-1; ip>=0; ip--) {
1003093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen            final SparseArray<ProcessState> uids = procMap.valueAt(ip);
1004093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen            for (int iu=uids.size()-1; iu>=0; iu--) {
1005093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen                uids.valueAt(iu).mTmpNumInUse = 0;
1006093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen           }
1007093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen        }
1008093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen
1009093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen        // Next reset or prune all per-package processes, and for the ones that are reset
1010093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen        // track this back to the common processes.
1011cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy        final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
101231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        for (int ip=pkgMap.size()-1; ip>=0; ip--) {
1013a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
1014a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka            for (int iu=uids.size()-1; iu>=0; iu--) {
10153d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
10163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                for (int iv=vpkgs.size()-1; iv>=0; iv--) {
10170280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                    final PackageState pkgState = vpkgs.valueAt(iv);
10183d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) {
10193d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        final ProcessState ps = pkgState.mProcesses.valueAt(iproc);
10203d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        if (ps.isInUse()) {
1021fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                            ps.resetSafely(now);
1022fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                            ps.mCommonProcess.mTmpNumInUse++;
10230280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                            ps.mCommonProcess.mTmpFoundSubProc = ps;
10243d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        } else {
10250280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                            pkgState.mProcesses.valueAt(iproc).makeDead();
1026d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                            pkgState.mProcesses.removeAt(iproc);
10270280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                        }
1028fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                    }
1029a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka                    for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) {
1030a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka                        final ServiceState ss = pkgState.mServices.valueAt(isvc);
10310280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                        if (ss.isInUse()) {
1032f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung                            ss.resetSafely(now);
1033f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung                        } else {
1034f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung                            pkgState.mServices.removeAt(isvc);
1035f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung                        }
1036f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung                    }
1037f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung                    if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) {
1038f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung                        vpkgs.removeAt(iv);
1039f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung                    }
1040f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung                }
10410280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                if (vpkgs.size() <= 0) {
104218042c82c5847d3caf9af65583c5590c17927c3dRomain Guy                    uids.removeAt(iu);
104318042c82c5847d3caf9af65583c5590c17927c3dRomain Guy                }
104431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
10457376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project            if (uids.size() <= 0) {
10467376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                pkgMap.removeAt(ip);
10470280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            }
10480280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        }
1049cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy
105031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        // Finally prune out any common processes that are no longer in use.
10513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        for (int ip=procMap.size()-1; ip>=0; ip--) {
105231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            final SparseArray<ProcessState> uids = procMap.valueAt(ip);
105331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            for (int iu=uids.size()-1; iu>=0; iu--) {
105431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                ProcessState ps = uids.valueAt(iu);
10557376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                if (ps.isInUse() || ps.mTmpNumInUse > 0) {
1056cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                    // If this is a process for multiple packages, we could at this point
10577376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                    // be back down to one package.  In that case, we want to revert back
105831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    // to a single shared ProcessState.  We can do this by converting the
1059cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                    // current package-specific ProcessState up to the shared ProcessState,
10603d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    // throwing away the current one we have here (because nobody else is
10619c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    // using it).
1062ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    if (!ps.mActive && ps.mMultiPackage && ps.mTmpNumInUse == 1) {
1063ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                        // Here we go...
106431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        ps = ps.mTmpFoundSubProc;
106531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        ps.mCommonProcess = ps;
1066cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                        uids.setValueAt(iu, ps);
1067ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    } else {
1068ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                        ps.resetSafely(now);
1069ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    }
1070ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                } else {
1071ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    ps.makeDead();
1072ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    uids.removeAt(iu);
1073bec6ac5bb3a9d6a677081eb50147abdc58a2cabbAdam Cohen                }
1074ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            }
1075337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung            if (uids.size() <= 0) {
1076337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung                procMap.removeAt(ip);
1077785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            }
1078785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        }
1079785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
1080ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mStartTime = now;
1081ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr);
1082ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    }
1083ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen
1084ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    private void resetCommon() {
1085ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mTimePeriodStartClock = System.currentTimeMillis();
1086ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        buildTimePeriodStartClockStr();
1087ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime();
1088ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mLongs.clear();
1089ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mLongs.add(new long[LONGS_SIZE]);
1090ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mNextLong = 0;
1091ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        Arrays.fill(mMemFactorDurations, 0);
1092ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mStartTime = 0;
1093ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mReadError = null;
1094ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mFlags = 0;
1095ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        evaluateSystemProperties(true);
1096ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    }
1097d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen
1098ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    public boolean evaluateSystemProperties(boolean update) {
1099ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        boolean changed = false;
1100ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib.1",
1101ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                VMRuntime.getRuntime().vmLibrary());
1102ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        if (!Objects.equals(runtime, mRuntime)) {
1103ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            changed = true;
1104ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            if (update) {
1105bec6ac5bb3a9d6a677081eb50147abdc58a2cabbAdam Cohen                mRuntime = runtime;
1106ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            }
1107d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen        }
1108d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen        String webview = WebViewFactory.useExperimentalWebView() ? "chromeview" : "webview";
1109d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen        if (!Objects.equals(webview, mWebView)) {
1110d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen            changed = true;
1111ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            if (update) {
1112ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                mWebView = webview;
1113ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            }
1114ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        }
1115ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        return changed;
1116ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    }
1117ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen
1118ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    private void buildTimePeriodStartClockStr() {
1119ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss",
1120ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                mTimePeriodStartClock).toString();
1121ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    }
1122ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen
1123ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    static final int[] BAD_TABLE = new int[0];
1124ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen
1125ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    private int[] readTableFromParcel(Parcel in, String name, String what) {
1126ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        final int size = in.readInt();
1127ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        if (size < 0) {
1128ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            Slog.w(TAG, "Ignoring existing stats; bad " + what + " table size: " + size);
1129ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            return BAD_TABLE;
1130ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        }
1131ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        if (size == 0) {
1132ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            return null;
1133ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        }
1134ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        final int[] table = new int[size];
1135ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        for (int i=0; i<size; i++) {
1136ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            table[i] = in.readInt();
1137ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            if (DEBUG_PARCEL) Slog.i(TAG, "Reading in " + name + " table #" + i + ": "
1138ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    + ProcessStats.printLongOffset(table[i]));
11392313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy            if (!validateLongOffset(table[i])) {
1140ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: "
1141ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                        + ProcessStats.printLongOffset(table[i]));
1142ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                return null;
1143ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            }
1144ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        }
1145ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        return table;
1146ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    }
1147ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen
1148ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    private void writeCompactedLongArray(Parcel out, long[] array, int num) {
1149ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        for (int i=0; i<num; i++) {
1150ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            long val = array[i];
1151ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            if (val < 0) {
1152ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                Slog.w(TAG, "Time val negative: " + val);
1153ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                val = 0;
1154ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            }
1155ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            if (val <= Integer.MAX_VALUE) {
1156ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                out.writeInt((int)val);
1157ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            } else {
1158ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                int top = ~((int)((val>>32)&0x7fffffff));
1159ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                int bottom = (int)(val&0xfffffff);
1160ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                out.writeInt(top);
1161ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                out.writeInt(bottom);
1162ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            }
1163ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        }
1164ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    }
1165ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen
1166ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    private void readCompactedLongArray(Parcel in, int version, long[] array, int num) {
1167292c025d06b41c42546e9771b0da0333e08f9db7Adam Cohen        if (version <= 10) {
1168ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            in.readLongArray(array);
1169ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            return;
1170ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        }
11712ddf13e175910f784cb4e54493ef202671e499f8Adam Cohen        final int alen = array.length;
1172ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        if (num > alen) {
1173ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            throw new RuntimeException("bad array lengths: got " + num + " array is " + alen);
1174ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        }
1175ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        int i;
1176ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        for (i=0; i<num; i++) {
1177ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            int val = in.readInt();
1178ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            if (val >= 0) {
1179ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                array[i] = val;
1180ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen            } else {
11810280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                int bottom = in.readInt();
11820280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                array[i] = (((long)~val)<<32) | bottom;
11839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1184ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        }
11859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        while (i < alen) {
11869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            array[i] = 0;
11879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            i++;
1188ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen        }
1189ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    }
1190ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen
1191ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen    private void writeCommonString(Parcel out, String name) {
11927376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project        Integer index = mCommonStringToIndex.get(name);
11937376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project        if (index != null) {
119431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            out.writeInt(index);
1195cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy            return;
1196a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung        }
1197a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung        index = mCommonStringToIndex.size();
1198a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung        mCommonStringToIndex.put(name, index);
1199a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung        out.writeInt(~index);
12002ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        out.writeString(name);
12012ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato    }
12022ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato
12032ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato    private String readCommonString(Parcel in, int version) {
12042ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        if (version <= 9) {
12052ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato            return in.readString();
12062ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        }
12072ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        int index = in.readInt();
12082ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        if (index >= 0) {
12092ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato            return mIndexToCommonString.get(index);
12102ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        }
12112ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        index = ~index;
12122ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        String name = in.readString();
12132ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        while (mIndexToCommonString.size() <= index) {
12142ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato            mIndexToCommonString.add(null);
12152ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        }
1216a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato        mIndexToCommonString.set(index, name);
1217a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato        return name;
1218a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato    }
12192ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato
12202ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato    @Override
122131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public int describeContents() {
122231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return 0;
122331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
122431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
122531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
122631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
1227a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato        long now = SystemClock.uptimeMillis();
12282ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        out.writeInt(MAGIC);
1229fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams        out.writeInt(PARCEL_VERSION);
123095bb800de9b0142bea0110b074eddbcf0e475736Adam Cohen        out.writeInt(STATE_COUNT);
123195bb800de9b0142bea0110b074eddbcf0e475736Adam Cohen        out.writeInt(ADJ_COUNT);
123214f122bf847e50a3e7730ccbe57abc25d086a01bJoe Onorato        out.writeInt(PSS_COUNT);
123314f122bf847e50a3e7730ccbe57abc25d086a01bJoe Onorato        out.writeInt(LONGS_SIZE);
123401f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka
12356ec2e187cd8f0b2d1c98e46b794efb99fd55556dPatrick Dubroy        mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.mMap.size());
1236785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
1237758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy        // First commit all running times.
1238a0aa0121b91fde17e427ab2763ce312e64cf5d33Patrick Dubroy        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
12396ec2e187cd8f0b2d1c98e46b794efb99fd55556dPatrick Dubroy        final int NPROC = procMap.size();
12403a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato        for (int ip=0; ip<NPROC; ip++) {
1241c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka            SparseArray<ProcessState> uids = procMap.valueAt(ip);
124273b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy            final int NUID = uids.size();
12433a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato            for (int iu=0; iu<NUID; iu++) {
12443a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato                uids.valueAt(iu).commitStateTime(now);
12453a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato            }
12463a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato        }
12473a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato        final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
124831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        final int NPKG = pkgMap.size();
1249337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung        for (int ip=0; ip<NPKG; ip++) {
125035aa14d5e33e4f5cccb9fd23be1047f26d67b409Michael Jurka            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
1251785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            final int NUID = uids.size();
1252785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            for (int iu=0; iu<NUID; iu++) {
1253785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
125431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                final int NVERS = vpkgs.size();
125531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                for (int iv=0; iv<NVERS; iv++) {
125631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    PackageState pkgState = vpkgs.valueAt(iv);
125731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    final int NPROCS = pkgState.mProcesses.size();
125831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    for (int iproc=0; iproc<NPROCS; iproc++) {
125931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        ProcessState proc = pkgState.mProcesses.valueAt(iproc);
126031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        if (proc.mCommonProcess != proc) {
126131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            proc.commitStateTime(now);
126231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        }
126331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    }
126431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    final int NSRVS = pkgState.mServices.size();
12650142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka                    for (int isvc=0; isvc<NSRVS; isvc++) {
126695bb800de9b0142bea0110b074eddbcf0e475736Adam Cohen                        pkgState.mServices.valueAt(isvc).commitStateTime(now);
126731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    }
1268883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka                }
126951e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen            }
127051e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen        }
127151e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen
127231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        out.writeLong(mTimePeriodStartClock);
12733d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        out.writeLong(mTimePeriodStartRealtime);
12743d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        out.writeLong(mTimePeriodEndRealtime);
12753d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        out.writeString(mRuntime);
12763d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        out.writeString(mWebView);
12773d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        out.writeInt(mFlags);
12783d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
127931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        out.writeInt(mLongs.size());
128031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        out.writeInt(mNextLong);
128131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        for (int i=0; i<(mLongs.size()-1); i++) {
128231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            long[] array = mLongs.get(i);
128331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            writeCompactedLongArray(out, array, array.length);
128431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
1285946ad470c72a3caa7568d11836c182b7f84d840dMichael Jurka        long[] lastLongs = mLongs.get(mLongs.size() - 1);
1286785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        writeCompactedLongArray(out, lastLongs, mNextLong);
1287785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
1288785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        if (mMemFactor != STATE_NOTHING) {
1289785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            mMemFactorDurations[mMemFactor] += now - mStartTime;
1290785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            mStartTime = now;
1291785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        }
1292785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        writeCompactedLongArray(out, mMemFactorDurations, mMemFactorDurations.length);
129331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
129431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        out.writeInt(NPROC);
129531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        for (int ip=0; ip<NPROC; ip++) {
129631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            writeCommonString(out, procMap.keyAt(ip));
129731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            final SparseArray<ProcessState> uids = procMap.valueAt(ip);
1298cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy            final int NUID = uids.size();
1299cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung            out.writeInt(NUID);
1300cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung            for (int iu=0; iu<NUID; iu++) {
1301cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung                out.writeInt(uids.keyAt(iu));
1302cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung                final ProcessState proc = uids.valueAt(iu);
1303cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung                writeCommonString(out, proc.mPackage);
130431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                out.writeInt(proc.mVersion);
13057376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                proc.writeToParcel(out, now);
130631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
1307a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato        }
130831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        out.writeInt(NPKG);
13092313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy        for (int ip=0; ip<NPKG; ip++) {
13102313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy            writeCommonString(out, pkgMap.keyAt(ip));
13112313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
131231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            final int NUID = uids.size();
131331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            out.writeInt(NUID);
131431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            for (int iu=0; iu<NUID; iu++) {
131531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                out.writeInt(uids.keyAt(iu));
13163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
13171e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                final int NVERS = vpkgs.size();
13181e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                out.writeInt(NVERS);
131934a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato                for (int iv=0; iv<NVERS; iv++) {
13202313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy                    out.writeInt(vpkgs.keyAt(iv));
13212313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy                    final PackageState pkgState = vpkgs.valueAt(iv);
13222313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy                    final int NPROCS = pkgState.mProcesses.size();
13232313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy                    out.writeInt(NPROCS);
13242313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy                    for (int iproc=0; iproc<NPROCS; iproc++) {
132560b7c53ccc6384b65aaca77d97794e8f09e8cfc8Patrick Dubroy                        writeCommonString(out, pkgState.mProcesses.keyAt(iproc));
132660b7c53ccc6384b65aaca77d97794e8f09e8cfc8Patrick Dubroy                        final ProcessState proc = pkgState.mProcesses.valueAt(iproc);
132731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        if (proc.mCommonProcess == proc) {
132831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            // This is the same as the common process we wrote above.
1329a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                            out.writeInt(0);
1330a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                        } else {
1331a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                            // There is separate data for this package's process.
1332a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                            out.writeInt(1);
133331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            proc.writeToParcel(out, now);
133431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        }
133508f97496b72aaff822aba89271e9bd458aafae2dRomain Guy                    }
133631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    final int NSRVS = pkgState.mServices.size();
133731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    out.writeInt(NSRVS);
133831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    for (int isvc=0; isvc<NSRVS; isvc++) {
133931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        out.writeString(pkgState.mServices.keyAt(isvc));
1340cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                        final ServiceState svc = pkgState.mServices.valueAt(isvc);
134131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        writeCommonString(out, svc.mProcessName);
1342138a04170d964da9cdec228e95b976875ae52481Karl Rosaen                        svc.writeToParcel(out, now);
1343c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    }
1344cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                }
1345138a04170d964da9cdec228e95b976875ae52481Karl Rosaen            }
1346138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        }
1347138a04170d964da9cdec228e95b976875ae52481Karl Rosaen
1348138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        mCommonStringToIndex = null;
1349138a04170d964da9cdec228e95b976875ae52481Karl Rosaen    }
135031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
135131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private boolean readCheckedInt(Parcel in, int val, String what) {
13523e244cf9d2da4fb04ef095f8b752a2a2c6e2f287Bjorn Bringert        int got;
135331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if ((got=in.readInt()) != val) {
1354cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy            mReadError = "bad " + what + ": " + got;
1355138a04170d964da9cdec228e95b976875ae52481Karl Rosaen            return false;
1356138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        }
1357138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        return true;
1358cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy    }
135931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
136031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static byte[] readFully(InputStream stream, int[] outLen) throws IOException {
136131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        int pos = 0;
136231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        final int initialAvail = stream.available();
13635905bca4c4d07051f0c77b30bf7b224e85dddf5aPatrick Dubroy        byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384];
13649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        while (true) {
13659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            int amt = stream.read(data, pos, data.length-pos);
136631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos
136731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    + " of avail " + data.length);
13682d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato            if (amt < 0) {
136931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos
137031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        + " len=" + data.length);
137131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                outLen[0] = pos;
13727ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung                return data;
13737ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung            }
13747ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung            pos += amt;
13752d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato            if (pos >= data.length) {
137631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                byte[] newData = new byte[pos+16384];
137731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len "
137831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        + newData.length);
137931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
138031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                data = newData;
138131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
138231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
138331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
138431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
138531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void read(InputStream stream) {
13865a94139ff6f5378901f8530f8dd3833d218e966dRomain Guy        try {
13875a94139ff6f5378901f8530f8dd3833d218e966dRomain Guy            int[] len = new int[1];
138831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            byte[] raw = readFully(stream, len);
138931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            Parcel in = Parcel.obtain();
139031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            in.unmarshall(raw, 0, len[0]);
139131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            in.setDataPosition(0);
139231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            stream.close();
139331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
139431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            readFromParcel(in);
139531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        } catch (IOException e) {
139631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            mReadError = "caught exception: " + e;
139731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
139831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
139931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1400785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung    public void readFromParcel(Parcel in) {
1401785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        final boolean hadData = mPackages.getMap().size() > 0
1402785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                || mProcesses.getMap().size() > 0;
1403785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        if (hadData) {
140431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            resetSafely();
140531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
140631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
140731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (!readCheckedInt(in, MAGIC, "magic number")) {
140831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return;
140931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
141031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        int version = in.readInt();
141131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (version != PARCEL_VERSION) {
141231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            mReadError = "bad version: " + version;
14137ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung            return;
14147ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung        }
14157ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung        if (!readCheckedInt(in, STATE_COUNT, "state count")) {
141631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return;
141731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
141831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (!readCheckedInt(in, ADJ_COUNT, "adj count")) {
141931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return;
1420ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project        }
142131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (!readCheckedInt(in, PSS_COUNT, "pss count")) {
142231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return;
142331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
142431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (!readCheckedInt(in, LONGS_SIZE, "longs size")) {
142531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return;
142631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
142731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
142831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mIndexToCommonString = new ArrayList<String>();
1429cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy
1430138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        mTimePeriodStartClock = in.readLong();
1431138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        buildTimePeriodStartClockStr();
1432138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        mTimePeriodStartRealtime = in.readLong();
1433138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        mTimePeriodEndRealtime = in.readLong();
143431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mRuntime = in.readString();
1435ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project        mWebView = in.readString();
1436ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project        mFlags = in.readInt();
1437cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy
1438138a04170d964da9cdec228e95b976875ae52481Karl Rosaen        final int NLONGS = in.readInt();
1439ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project        final int NEXTLONG = in.readInt();
1440ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project        mLongs.clear();
14419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        for (int i=0; i<(NLONGS-1); i++) {
14429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            while (i >= mLongs.size()) {
144331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                mLongs.add(new long[LONGS_SIZE]);
144431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
14459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            readCompactedLongArray(in, version, mLongs.get(i), LONGS_SIZE);
1446f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
1447fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen        long[] longs = new long[LONGS_SIZE];
1448f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project        mNextLong = NEXTLONG;
1449f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project        readCompactedLongArray(in, version, longs, NEXTLONG);
14500280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        mLongs.add(longs);
14513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
14523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        readCompactedLongArray(in, version, mMemFactorDurations, mMemFactorDurations.length);
14533d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
14543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        int NPROC = in.readInt();
14553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        if (NPROC < 0) {
14560280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            mReadError = "bad process count: " + NPROC;
14570280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            return;
14587ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung        }
14597ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung        while (NPROC > 0) {
14607ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung            NPROC--;
14617ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung            final String procName = readCommonString(in, version);
1462af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka            if (procName == null) {
14637376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                mReadError = "bad process name";
14647376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                return;
1465af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka            }
1466af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka            int NUID = in.readInt();
146755cef262f97749300c2f6e764da0b00cbcb78879Winson Chung            if (NUID < 0) {
1468af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka                mReadError = "bad uid count: " + NUID;
1469af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka                return;
147055cef262f97749300c2f6e764da0b00cbcb78879Winson Chung            }
14717984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert            while (NUID > 0) {
14727376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project                NUID--;
14737984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert                final int uid = in.readInt();
14747984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert                if (uid < 0) {
14757984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert                    mReadError = "bad uid: " + uid;
14767984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert                    return;
14777984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert                }
147855cef262f97749300c2f6e764da0b00cbcb78879Winson Chung                final String pkgName = readCommonString(in, version);
147968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                if (pkgName == null) {
148068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                    mReadError = "bad process package name";
148168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                    return;
148268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                }
148368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                final int vers = in.readInt();
148468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                ProcessState proc = hadData ? mProcesses.get(procName, uid) : null;
148568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                if (proc != null) {
148668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                    if (!proc.readFromParcel(in, false)) {
148768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                        return;
148868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                    }
14890d5aad7edbed3ed5c13904cc13ec8842ffe8837bDianne Hackborn                } else {
149068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                    proc = new ProcessState(this, pkgName, uid, vers, procName);
149168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                    if (!proc.readFromParcel(in, true)) {
149268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                        return;
149368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                    }
149468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                }
149568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid
149668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                        + " " + proc);
149768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung                mProcesses.put(procName, uid, proc);
149868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung            }
149968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung        }
150068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung
150168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung        if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes");
150268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung
150368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung        int NPKG = in.readInt();
150468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung        if (NPKG < 0) {
150568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung            mReadError = "bad package count: " + NPKG;
150655cef262f97749300c2f6e764da0b00cbcb78879Winson Chung            return;
1507f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project        }
15088e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy        while (NPKG > 0) {
15097984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert            NPKG--;
15107984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert            final String pkgName = readCommonString(in, version);
15113d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            if (pkgName == null) {
1512557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                mReadError = "bad package name";
1513557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                return;
1514557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung            }
151531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            int NUID = in.readInt();
151631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (NUID < 0) {
1517cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                mReadError = "bad uid count: " + NUID;
1518fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                return;
1519fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            }
1520fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen            while (NUID > 0) {
1521fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                NUID--;
1522fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                final int uid = in.readInt();
1523fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                if (uid < 0) {
1524fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                    mReadError = "bad uid: " + uid;
1525fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                    return;
15263d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                }
15273d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                int NVERS = in.readInt();
15280280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                if (NVERS < 0) {
15293d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    mReadError = "bad versions count: " + NVERS;
15303d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    return;
15313d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                }
1532fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                while (NVERS > 0) {
1533fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                    NVERS--;
15343d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    final int vers = in.readInt();
15353d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    PackageState pkgState = new PackageState(pkgName, uid);
1536fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                    SparseArray<PackageState> vpkg = mPackages.get(pkgName, uid);
15370280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                    if (vpkg == null) {
15380280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                        vpkg = new SparseArray<PackageState>();
15390280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                        mPackages.put(pkgName, uid, vpkg);
15400280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                    }
15410280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                    vpkg.put(vers, pkgState);
15420280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                    int NPROCS = in.readInt();
1543fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                    if (NPROCS < 0) {
1544fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        mReadError = "bad package process count: " + NPROCS;
1545fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        return;
1546fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                    }
1547fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                    while (NPROCS > 0) {
1548fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        NPROCS--;
1549fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        String procName = readCommonString(in, version);
1550fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        if (procName == null) {
15513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                            mReadError = "bad package process name";
15523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                            return;
1553fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        }
15543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        int hasProc = in.readInt();
15553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid
15563d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                                + " process " + procName + " hasProc=" + hasProc);
1557fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        ProcessState commonProc = mProcesses.get(procName, uid);
15583d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid
15593d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                                + ": " + commonProc);
1560fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        if (commonProc == null) {
1561fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                            mReadError = "no common proc: " + procName;
1562fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                            return;
1563fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        }
1564fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                        if (hasProc != 0) {
1565fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                            // The process for this package is unique to the package; we
1566fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen                            // need to load it.  We don't need to do anything about it if
1567deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato                            // it is not unique because if someone later looks for it
1568c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                            // they will find and use it from the global procs.
1569c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                            ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null;
1570c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                            if (proc != null) {
1571cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                                if (!proc.readFromParcel(in, false)) {
1572c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                                    return;
1573c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                                }
1574c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                            } else {
1575cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                                proc = new ProcessState(commonProc, pkgName, uid, vers, procName,
1576c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                                        0);
1577c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                                if (!proc.readFromParcel(in, true)) {
157858f208892274c91b83dbbad6c50ea8638f106b33Winson Chung                                    return;
15794a79a04bcd5f8c4d4fab7bcc46eea9e19a3dc63eJoe Onorato                                }
1580c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                            }
15814a79a04bcd5f8c4d4fab7bcc46eea9e19a3dc63eJoe Onorato                            if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: "
1582c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                                    + procName + " " + uid + " " + proc);
158331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            pkgState.mProcesses.put(procName, proc);
158431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        } else {
158524ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung                            if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: "
158624ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung                                    + procName + " " + uid + " " + commonProc);
158724ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung                            pkgState.mProcesses.put(procName, commonProc);
158824ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung                        }
15893d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    }
15903d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    int NSRVS = in.readInt();
1591d044526d82e7938cf35b296978d9d5302f98b4afAdam Cohen                    if (NSRVS < 0) {
159231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        mReadError = "bad package service count: " + NSRVS;
159331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        return;
159431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    }
15953d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    while (NSRVS > 0) {
15963d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        NSRVS--;
1597319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                        String serviceName = in.readString();
159831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        if (serviceName == null) {
159931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            mReadError = "bad package service name";
16003d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                            return;
16013d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        }
16023d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        String processName = version > 9 ? readCommonString(in, version) : null;
16033d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null;
1604df0353815c629fc678824b07a234b89a1ff94208Adam Cohen                        if (serv == null) {
16059c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                            serv = new ServiceState(this, pkgName, serviceName, processName, null);
16069c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        }
16079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        if (!serv.readFromParcel(in)) {
1608319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                            return;
160931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        }
1610cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                        if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: "
161131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                + serviceName + " " + uid + " " + serv);
161231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        pkgState.mServices.put(serviceName, serv);
161331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    }
161431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                }
161531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
161631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
161731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
161831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mIndexToCommonString = null;
1619c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka
162031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!");
16218355ae39ad77b8e2e9ff3b4cbff8077a002ce151Dianne Hackborn    }
16228355ae39ad77b8e2e9ff3b4cbff8077a002ce151Dianne Hackborn
1623f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy    int addLongData(int index, int type, int num) {
1624f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy        int tableLen = mAddLongTable != null ? mAddLongTable.length : 0;
1625f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy        if (mAddLongTableSize >= tableLen) {
1626f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy            int newSize = ArrayUtils.idealIntArraySize(tableLen + 1);
1627f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy            int[] newTable = new int[newSize];
1628f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy            if (tableLen > 0) {
1629f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy                System.arraycopy(mAddLongTable, 0, newTable, 0, tableLen);
1630f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy            }
1631f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy            mAddLongTable = newTable;
1632f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy        }
1633f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy        if (mAddLongTableSize > 0 && mAddLongTableSize - index != 0) {
1634a0618e4102d0543d953d81e162d93c8ea641d0fdMike Cleron            System.arraycopy(mAddLongTable, index, mAddLongTable, index + 1,
163531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    mAddLongTableSize - index);
163631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
16372ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        int off = allocLongData(num);
16382ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        mAddLongTable[index] = type | off;
16392ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        mAddLongTableSize++;
16402ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        return off;
16411e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey    }
16421e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey
16431e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey    int allocLongData(int num) {
16441e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey        int whichLongs = mLongs.size()-1;
16451e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey        long[] longs = mLongs.get(whichLongs);
16461e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey        if (mNextLong + num > longs.length) {
164731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            longs = new long[LONGS_SIZE];
164831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            mLongs.add(longs);
164931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            whichLongs++;
165031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            mNextLong = 0;
1651678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn        }
1652678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn        int off = (whichLongs<<OFFSET_ARRAY_SHIFT) | (mNextLong<<OFFSET_INDEX_SHIFT);
1653be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        mNextLong += num;
1654eb5615d1af1ef38fd934590b9aec19e1d0cd0908Jason Sams        return off;
1655be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato    }
1656be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato
1657be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato    boolean validateLongOffset(int off) {
1658be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        int arr = (off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK;
1659678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn        if (arr >= mLongs.size()) {
1660678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn            return false;
1661678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn        }
166231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        int idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK;
166331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (idx >= LONGS_SIZE) {
166431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return false;
166531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
166631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (DEBUG_PARCEL) Slog.d(TAG, "Validated long " + printLongOffset(off)
166731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                + ": " + getLong(off, 0));
166831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return true;
166931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
167088ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato
167188ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato    static String printLongOffset(int off) {
1672f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        StringBuilder sb = new StringBuilder(16);
1673c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka        sb.append("a"); sb.append((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
167494f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy        sb.append("i"); sb.append((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK);
167576fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen        sb.append("t"); sb.append((off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK);
167676fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen        return sb.toString();
167776fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen    }
167876fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen
167976fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen    void setLong(int off, int index, long value) {
168076fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen        long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
168194f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy        longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)] = value;
1682758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy    }
1683758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy
168494f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy    long getLong(int off, int index) {
168594f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy        long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1686af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka        return longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)];
168788ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato    }
168888ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato
16892801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen    static int binarySearch(int[] array, int size, int value) {
169031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        int lo = 0;
169131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        int hi = size - 1;
169231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
169331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        while (lo <= hi) {
169431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            int mid = (lo + hi) >>> 1;
169531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            int midVal = (array[mid] >> OFFSET_TYPE_SHIFT) & OFFSET_TYPE_MASK;
169631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
169731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (midVal < value) {
16987f4eabe3709a72b416569136e4a095431c493c8bAdam Cohen                lo = mid + 1;
16998c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            } else if (midVal > value) {
170031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                hi = mid - 1;
17013d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            } else {
17022801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                return mid;  // value found
1703df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen            }
17047f4eabe3709a72b416569136e4a095431c493c8bAdam Cohen        }
1705df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen        return ~lo;  // value not present
170631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
170731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
170831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public PackageState getPackageStateLocked(String packageName, int uid, int vers) {
17091e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey        SparseArray<PackageState> vpkg = mPackages.get(packageName, uid);
17101e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey        if (vpkg == null) {
17111e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey            vpkg = new SparseArray<PackageState>();
1712bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka            mPackages.put(packageName, uid, vpkg);
1713bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka        }
1714bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka        PackageState as = vpkg.get(vers);
17151e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey        if (as != null) {
17161e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey            return as;
17171e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey        }
17189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        as = new PackageState(packageName, uid);
17199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        vpkg.put(vers, as);
172031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return as;
17213d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung    }
17224eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen
172331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public ProcessState getProcessStateLocked(String packageName, int uid, int vers,
172499c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey            String processName) {
172531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        final PackageState pkgState = getPackageStateLocked(packageName, uid, vers);
172631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        ProcessState ps = pkgState.mProcesses.get(processName);
172731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (ps != null) {
172831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return ps;
172931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
173031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        ProcessState commonProc = mProcesses.get(processName, uid);
173131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (commonProc == null) {
17320589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            commonProc = new ProcessState(this, packageName, uid, vers, processName);
173331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            mProcesses.put(processName, uid, commonProc);
1734fb5411e98278d461b78aea0663d3e85f7a9e8a15Romain Guy            if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc);
173513724ea6078748195bcf747641bf6ee8fbbe0f4bJoe Onorato        }
173613724ea6078748195bcf747641bf6ee8fbbe0f4bJoe Onorato        if (!commonProc.mMultiPackage) {
1737fb5411e98278d461b78aea0663d3e85f7a9e8a15Romain Guy            if (packageName.equals(commonProc.mPackage) && vers == commonProc.mVersion) {
1738fb5411e98278d461b78aea0663d3e85f7a9e8a15Romain Guy                // This common process is not in use by multiple packages, and
1739ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka                // is for the calling package, so we can just use it directly.
1740ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka                ps = commonProc;
1741ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka                if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc);
1742ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka            } else {
1743ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka                if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!");
1744ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka                // This common process has not been in use by multiple packages,
174531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                // but it was created for a different package than the caller.
1746a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                // We need to convert it to a multi-package process.
1747a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                commonProc.mMultiPackage = true;
1748a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                // To do this, we need to make two new process states, one a copy
1749a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                // of the current state for the process under the original package
1750f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                // name, and the second a free new process state for it as the
1751f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                // new package name.
1752c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                long now = SystemClock.uptimeMillis();
17537404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato                // First let's make a copy of the current process state and put
17543a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato                // that under the now unique state for its original package name.
17557404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato                final PackageState commonPkgState = getPackageStateLocked(commonProc.mPackage,
175631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        uid, commonProc.mVersion);
175731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                if (commonPkgState != null) {
175831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    ProcessState cloned = commonProc.clone(commonProc.mPackage, now);
17590e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka                    if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.mPackage
1760dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka                            + ": " + cloned);
1761c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    commonPkgState.mProcesses.put(commonProc.mName, cloned);
1762c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    // If this has active services, we need to update their process pointer
17630e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka                    // to point to the new package-specific process state.
17640e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka                    for (int i=commonPkgState.mServices.size()-1; i>=0; i--) {
17650e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka                        ServiceState ss = commonPkgState.mServices.valueAt(i);
1766af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka                        if (ss.mProc == commonProc) {
17672c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka                            if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: "
17682c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka                                    + ss);
17692c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka                            ss.mProc = cloned;
17702c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka                        } else if (DEBUG) {
17712c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka                            Slog.d(TAG, "GETPROC leaving proc of " + ss);
17720423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka                        }
17731f878a1fc51571f9750e9b7a1b9de1c44a0c3e97Amith Yamasani                    }
17741f878a1fc51571f9750e9b7a1b9de1c44a0c3e97Amith Yamasani                } else {
17752c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka                    Slog.w(TAG, "Cloning proc state: no package state " + commonProc.mPackage
17762c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka                            + "/" + uid + " for proc " + commonProc.mName);
17772c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka                }
17786d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                // And now make a fresh new process state for the new package name.
17796d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                ps = new ProcessState(commonProc, packageName, uid, vers, processName, now);
17806d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
17816d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            }
17826d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani        } else {
17836d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            // The common process is for multiple packages, we need to create a
17846d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            // separate object for the per-package data.
17856d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            ps = new ProcessState(commonProc, packageName, uid, vers, processName,
17866d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                    SystemClock.uptimeMillis());
17876d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
17886d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani        }
17896d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani        pkgState.mProcesses.put(processName, ps);
17906d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani        if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps);
17916d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani        return ps;
17926d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani    }
17932c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka
1794af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka    public ProcessStats.ServiceState getServiceStateLocked(String packageName, int uid, int vers,
1795af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka            String processName, String className) {
1796af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka        final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid, vers);
1797af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka        ProcessStats.ServiceState ss = as.mServices.get(className);
17982c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka        if (ss != null) {
1799558654c6ec6eefa260e5a1c1c44fc6e13ec20473Patrick Dubroy            if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss);
1800af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka            return ss;
1801af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka        }
18022c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka        final ProcessStats.ProcessState ps = processName != null
18032c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka                ? getProcessStateLocked(packageName, uid, vers, processName) : null;
18042c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka        ss = new ProcessStats.ServiceState(this, packageName, className, processName, ps);
18052c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka        as.mServices.put(className, ss);
18062c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka        if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps);
18072c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka        return ss;
18082c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka    }
18092c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka
18102c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka    private void dumpProcessInternalLocked(PrintWriter pw, String prefix, ProcessState proc,
18112c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka            boolean dumpAll) {
1812ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy        if (dumpAll) {
1813ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy            pw.print(prefix); pw.print("myID=");
1814ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy                    pw.print(Integer.toHexString(System.identityHashCode(proc)));
1815ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy                    pw.print(" mCommonProcess=");
1816ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy                    pw.print(Integer.toHexString(System.identityHashCode(proc.mCommonProcess)));
1817ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy                    pw.print(" mPackage="); pw.println(proc.mPackage);
1818bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy            if (proc.mMultiPackage) {
1819bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy                pw.print(prefix); pw.print("mMultiPackage="); pw.println(proc.mMultiPackage);
18204ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy            }
18214ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy            if (proc != proc.mCommonProcess) {
18224ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy                pw.print(prefix); pw.print("Common Proc: "); pw.print(proc.mCommonProcess.mName);
18234ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy                        pw.print("/"); pw.print(proc.mCommonProcess.mUid);
18244ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy                        pw.print(" pkg="); pw.println(proc.mCommonProcess.mPackage);
18255539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy            }
18265539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy        }
18275539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy        if (proc.mActive) {
18285539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy            pw.print(prefix); pw.print("mActive="); pw.println(proc.mActive);
18295539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy        }
18305539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy        if (proc.mDead) {
18315539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy            pw.print(prefix); pw.print("mDead="); pw.println(proc.mDead);
18325539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy        }
18335539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy        if (proc.mNumActiveServices != 0 || proc.mNumStartedServices != 0) {
18345539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy            pw.print(prefix); pw.print("mNumActiveServices="); pw.print(proc.mNumActiveServices);
18355539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy                    pw.print(" mNumStartedServices=");
18365539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy                    pw.println(proc.mNumStartedServices);
18375539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy        }
1838bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy    }
1839bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy
1840ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka    public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary,
184131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            boolean dumpAll, boolean activeOnly) {
184231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
184331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                mStartTime, now);
1844ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka        ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
184531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        boolean printedHeader = false;
184631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        boolean sepNeeded = false;
1847c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler        for (int ip=0; ip<pkgMap.size(); ip++) {
184831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            final String pkgName = pkgMap.keyAt(ip);
184931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
1850a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato            for (int iu=0; iu<uids.size(); iu++) {
185131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                final int uid = uids.keyAt(iu);
1852f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
1853f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato                for (int iv=0; iv<vpkgs.size(); iv++) {
18548e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                    final int vers = vpkgs.keyAt(iv);
1855ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka                    final PackageState pkgState = vpkgs.valueAt(iv);
18568e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                    final int NPROCS = pkgState.mProcesses.size();
1857aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung                    final int NSRVS = pkgState.mServices.size();
18588e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                    final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName);
18598e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                    if (!pkgMatch) {
18608e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                        boolean procMatch = false;
18618e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                        for (int iproc=0; iproc<NPROCS; iproc++) {
18628e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                            ProcessState proc = pkgState.mProcesses.valueAt(iproc);
18638e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                            if (reqPackage.equals(proc.mName)) {
18648e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                                procMatch = true;
18658e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                                break;
18668e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                            }
18678e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy                        }
186831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        if (!procMatch) {
186931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            continue;
187031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        }
1871a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                    }
1872a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                    if (NPROCS > 0 || NSRVS > 0) {
1873a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                        if (!printedHeader) {
187431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            pw.println("Per-Package Stats:");
187531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            printedHeader = true;
187631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            sepNeeded = true;
1877a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                        }
187831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        pw.print("  * "); pw.print(pkgName); pw.print(" / ");
187931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                UserHandle.formatUid(pw, uid); pw.print(" / v");
1880a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                                pw.print(vers); pw.println(":");
188131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    }
188231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    if (!dumpSummary || dumpAll) {
18830142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka                        for (int iproc=0; iproc<NPROCS; iproc++) {
188431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            ProcessState proc = pkgState.mProcesses.valueAt(iproc);
188531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            if (!pkgMatch && !reqPackage.equals(proc.mName)) {
18860142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka                                continue;
188731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            }
188831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            if (activeOnly && !proc.isInUse()) {
188931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                pw.print("      (Not active: ");
1890a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                                        pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")");
189131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                continue;
189231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            }
189331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            pw.print("      Process ");
189431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            pw.print(pkgState.mProcesses.keyAt(iproc));
189531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            if (proc.mCommonProcess.mMultiPackage) {
18962801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                                pw.print(" (multi, ");
18972801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            } else {
18982801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                                pw.print(" (unique, ");
18992801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            }
19002801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            pw.print(proc.mDurationsTableSize);
19012801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            pw.print(" entries)");
19022801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            pw.println(":");
19032801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            dumpProcessState(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
19042801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                                    ALL_PROC_STATES, now);
19052801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            dumpProcessPss(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
19062801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                                    ALL_PROC_STATES);
19072801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            dumpProcessInternalLocked(pw, "        ", proc, dumpAll);
19082801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                        }
19092801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                    } else {
19102801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                        ArrayList<ProcessState> procs = new ArrayList<ProcessState>();
19112801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                        for (int iproc=0; iproc<NPROCS; iproc++) {
19122801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            ProcessState proc = pkgState.mProcesses.valueAt(iproc);
19132801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            if (!pkgMatch && !reqPackage.equals(proc.mName)) {
19142801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                                continue;
19152801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            }
191631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            if (activeOnly && !proc.isInUse()) {
1917774bd377df3053ef43e34ab8ca98160eb6811be1Michael Jurka                                continue;
191831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            }
191931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            procs.add(proc);
192031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        }
192131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        dumpProcessSummaryLocked(pw, "      ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
192231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                NON_CACHED_PROC_STATES, false, now, totalTime);
1923a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                    }
1924a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                    for (int isvc=0; isvc<NSRVS; isvc++) {
1925a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                        ServiceState svc = pkgState.mServices.valueAt(isvc);
192631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        if (!pkgMatch && !reqPackage.equals(svc.mProcessName)) {
19272801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                            continue;
1928a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                        }
192931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        if (activeOnly && !svc.isInUse()) {
19308e776a62c5cc60737f5cdbbeacfec5f958112fa7Adam Cohen                            pw.print("      (Not active: ");
19318e776a62c5cc60737f5cdbbeacfec5f958112fa7Adam Cohen                                    pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")");
19328e776a62c5cc60737f5cdbbeacfec5f958112fa7Adam Cohen                            continue;
1933a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                        }
1934a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen                        if (dumpAll) {
193531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            pw.print("      Service ");
193631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        } else {
193731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            pw.print("      * ");
1938e708c5249b26978057acb9370cbfb8f6f747f5b8Patrick Dubroy                        }
1939e708c5249b26978057acb9370cbfb8f6f747f5b8Patrick Dubroy                        pw.print(pkgState.mServices.keyAt(isvc));
1940e708c5249b26978057acb9370cbfb8f6f747f5b8Patrick Dubroy                        pw.println(":");
1941e708c5249b26978057acb9370cbfb8f6f747f5b8Patrick Dubroy                        pw.print("        Process: "); pw.println(svc.mProcessName);
19429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        dumpServiceStats(pw, "        ", "          ", "    ", "Running", svc,
194331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                svc.mRunCount, ServiceState.SERVICE_RUN, svc.mRunState,
194431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                svc.mRunStartTime, now, totalTime, !dumpSummary || dumpAll);
194531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        dumpServiceStats(pw, "        ", "          ", "    ", "Started", svc,
194631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                svc.mStartedCount, ServiceState.SERVICE_STARTED, svc.mStartedState,
19478c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                                svc.mStartedStartTime, now, totalTime, !dumpSummary || dumpAll);
194831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        dumpServiceStats(pw, "        ", "          ", "      ", "Bound", svc,
194931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                svc.mBoundCount, ServiceState.SERVICE_BOUND, svc.mBoundState,
19500280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                                svc.mBoundStartTime, now, totalTime, !dumpSummary || dumpAll);
19510280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                        dumpServiceStats(pw, "        ", "          ", "  ", "Executing", svc,
195231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState,
19530280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                                svc.mExecStartTime, now, totalTime, !dumpSummary || dumpAll);
195431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        if (dumpAll) {
195531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            if (svc.mOwner != null) {
195631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                pw.print("        mOwner="); pw.println(svc.mOwner);
19573d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                            }
19583d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                            if (svc.mStarted || svc.mRestarting) {
19590280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                                pw.print("        mStarted="); pw.print(svc.mStarted);
19603d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                                pw.print(" mRestarting="); pw.println(svc.mRestarting);
19613d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                            }
19620280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                        }
19630280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                    }
19640280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                }
19650280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            }
196655b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung        }
196731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
19680280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
196931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        printedHeader = false;
19700d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato        int numShownProcs = 0, numTotalProcs = 0;
19710d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato        for (int ip=0; ip<procMap.size(); ip++) {
19720280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            String procName = procMap.keyAt(ip);
197331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            SparseArray<ProcessState> uids = procMap.valueAt(ip);
197431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            for (int iu=0; iu<uids.size(); iu++) {
197531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                int uid = uids.keyAt(iu);
197631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                numTotalProcs++;
197731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                ProcessState proc = uids.valueAt(iu);
197831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                if (proc.mDurationsTableSize == 0 && proc.mCurState == STATE_NOTHING
19793d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        && proc.mPssTableSize == 0) {
19803d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    continue;
19813d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                }
19821fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy                if (!proc.mMultiPackage) {
19833d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    continue;
19843d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                }
19851fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy                if (reqPackage != null && !reqPackage.equals(procName)
19861fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy                        && !reqPackage.equals(proc.mPackage)) {
19873d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    continue;
19883d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                }
19893d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                numShownProcs++;
19903d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                if (sepNeeded) {
19913d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    pw.println();
19923d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                }
19933d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                sepNeeded = true;
19943d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                if (!printedHeader) {
19953d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                    pw.println("Multi-Package Common Processes:");
19969d31e9fa3dedf7c51b407c1c5fafe5294fc3c01bRomain Guy                    printedHeader = true;
19973d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                }
19983d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                if (activeOnly && !proc.isInUse()) {
1999a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy                    pw.print("      (Not active: "); pw.print(procName); pw.println(")");
2000a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy                    continue;
2001a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy                }
200231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.print("  * "); pw.print(procName); pw.print(" / ");
200331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        UserHandle.formatUid(pw, uid);
200431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        pw.print(" ("); pw.print(proc.mDurationsTableSize);
200531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        pw.print(" entries)"); pw.println(":");
200631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                dumpProcessState(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
200731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        ALL_PROC_STATES, now);
200831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                dumpProcessPss(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
200931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        ALL_PROC_STATES);
201031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                dumpProcessInternalLocked(pw, "        ", proc, dumpAll);
201131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
201231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
201331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (dumpAll) {
201431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.println();
201531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print("  Total procs: "); pw.print(numShownProcs);
201631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total");
201731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
201831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
201931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (sepNeeded) {
202031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.println();
202131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
202231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (dumpSummary) {
202331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.println("Summary:");
20247b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy            dumpSummaryLocked(pw, reqPackage, now, activeOnly);
20257b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        } else {
20267b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy            dumpTotalsLocked(pw, now);
20277b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        }
20287b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy
20297b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        if (dumpAll) {
203031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.println();
203131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.println("Internal state:");
203231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print("  Num long arrays: "); pw.println(mLongs.size());
203331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print("  Next long entry: "); pw.println(mNextLong);
203431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print("  mRunning="); pw.println(mRunning);
203531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
203631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
203731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
203831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public static long dumpSingleServiceTime(PrintWriter pw, String prefix, ServiceState service,
203931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            int serviceType, int curState, long curStartTime, long now) {
2040fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen        long totalTime = 0;
20410280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka        int printedScreen = -1;
20423d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
20433d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            int printedMem = -1;
204431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
204531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                int state = imem+iscreen;
204631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                long time = service.getDuration(serviceType, curState, curStartTime,
204731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        state, now);
2048deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato                String running = "";
20490e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka                if (curState == state && pw != null) {
205073b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                    running = " (running)";
205173b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                }
205273b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                if (time != 0) {
205373b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                    if (pw != null) {
205473b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                        pw.print(prefix);
205573b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                        printScreenLabel(pw, printedScreen != iscreen
205673b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                                ? iscreen : STATE_NOTHING);
205773b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                        printedScreen = iscreen;
205873b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                        printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0);
205973b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                        printedMem = imem;
206073b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                        pw.print(": ");
206173b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                        TimeUtils.formatDuration(time, pw); pw.println(running);
206273b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                    }
2063deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato                    totalTime += time;
206473b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy                }
206573b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy            }
2066deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato        }
206773b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy        if (totalTime != 0 && pw != null) {
206873b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy            pw.print(prefix);
206931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print("    TOTAL: ");
207031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            TimeUtils.formatDuration(totalTime, pw);
207131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.println();
207231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
207331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return totalTime;
207431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
207531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
207631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    void dumpServiceStats(PrintWriter pw, String prefix, String prefixInner,
207731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            String headerPrefix, String header, ServiceState service,
207831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            int count, int serviceType, int state, long startTime, long now, long totalTime,
207931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            boolean dumpAll) {
208031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (count != 0) {
208131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (dumpAll) {
208231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.print(prefix); pw.print(header);
208331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.print(" op count "); pw.print(count); pw.println(":");
208431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                dumpSingleServiceTime(pw, prefixInner, service, serviceType, state, startTime,
208531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        now);
208631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            } else {
208731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                long myTime = dumpSingleServiceTime(null, null, service, serviceType, state,
208831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        startTime, now);
208931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.print(prefix); pw.print(headerPrefix); pw.print(header);
209031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.print(" count "); pw.print(count);
209131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.print(" / time ");
209231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                printPercent(pw, (double)myTime/(double)totalTime);
209331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.println();
209431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
209531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
209631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
209731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
209831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) {
209931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
21007b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy                mStartTime, now);
21017b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        dumpFilteredSummaryLocked(pw, null, "  ", ALL_SCREEN_ADJ, ALL_MEM_ADJ,
21027b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy                ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly);
21037b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        pw.println();
21047018d8e32761d65816c01f62b094e17e44c7ffb9Joe Onorato        dumpTotalsLocked(pw, now);
2105d753b42d5170ec30172393be538b957b00345d97Joe Onorato    }
2106d753b42d5170ec30172393be538b957b00345d97Joe Onorato
2107d753b42d5170ec30172393be538b957b00345d97Joe Onorato    void dumpTotalsLocked(PrintWriter pw, long now) {
2108d753b42d5170ec30172393be538b957b00345d97Joe Onorato        pw.println("Run time Stats:");
21097b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        dumpSingleTime(pw, "  ", mMemFactorDurations, mMemFactor, mStartTime, now);
21107b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        pw.println();
21117b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        pw.print("          Start time: ");
21127b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock));
211331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        pw.println();
211431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        pw.print("  Total elapsed time: ");
211531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        TimeUtils.formatDuration(
211631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime)
211731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        - mTimePeriodStartRealtime, pw);
211831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        boolean partial = true;
2119319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick        if ((mFlags&FLAG_SHUTDOWN) != 0) {
212031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(" (shutdown)");
212131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            partial = false;
212231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
21239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        if ((mFlags&FLAG_SYSPROPS) != 0) {
21247c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato            pw.print(" (sysprops)");
21259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            partial = false;
212631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
212731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if ((mFlags&FLAG_COMPLETE) != 0) {
212831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            pw.print(" (complete)");
212931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            partial = false;
2130a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen        }
2131a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen        if (partial) {
2132a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen            pw.print(" (partial)");
213331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
213431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        pw.print(' ');
21357c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato        pw.print(mRuntime);
21369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        pw.print(' ');
21379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        pw.print(mWebView);
213831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        pw.println();
213931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
214031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
214131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix,
214231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            int[] screenStates, int[] memStates, int[] procStates,
214331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) {
214431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates,
214531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                procStates, sortProcStates, now, reqPackage, activeOnly);
214631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (procs.size() > 0) {
214731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (header != null) {
214831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.println();
214931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                pw.println(header);
215031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
2151843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler            dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates,
2152843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler                    sortProcStates, true, now, totalTime);
2153f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2154fb0ca67aea25f4282096d9247ddaebee6fbf7e00Joe Onorato    }
2155fb0ca67aea25f4282096d9247ddaebee6fbf7e00Joe Onorato
2156c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler    public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates,
2157c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler            int[] procStates, int sortProcStates[], long now, String reqPackage,
2158f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            boolean activeOnly) {
2159c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler        final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>();
2160c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler        final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
2161c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler        for (int ip=0; ip<pkgMap.size(); ip++) {
21626b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy            final String pkgName = pkgMap.keyAt(ip);
21636b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy            final SparseArray<SparseArray<PackageState>> procs = pkgMap.valueAt(ip);
21646b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy            for (int iu=0; iu<procs.size(); iu++) {
21656b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                final SparseArray<PackageState> vpkgs = procs.valueAt(iu);
2166f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                final int NVERS = vpkgs.size();
21676b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                for (int iv=0; iv<NVERS; iv++) {
21686b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                    final PackageState state = vpkgs.valueAt(iv);
21696b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                    final int NPROCS = state.mProcesses.size();
21706b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                    final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName);
217161033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen                    for (int iproc=0; iproc<NPROCS; iproc++) {
21726b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                        final ProcessState proc = state.mProcesses.valueAt(iproc);
217361033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen                        if (!pkgMatch && !reqPackage.equals(proc.mName)) {
217461033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen                            continue;
217561033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen                        }
2176f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                        if (activeOnly && !proc.isInUse()) {
2177ea57348cc8f4647f6bc35a42cd45662ddb828b92Michael Jurka                            continue;
2178f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen                        }
21796b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                        foundProcs.add(proc.mCommonProcess);
2180f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen                    }
218161033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen                }
21826b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy            }
21836b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy        }
2184c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler        ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size());
21853ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy        for (int i=0; i<foundProcs.size(); i++) {
21863ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy            ProcessState proc = foundProcs.valueAt(i);
21873ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy            if (computeProcessTimeLocked(proc, screenStates, memStates, procStates, now) > 0) {
21883ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                outProcs.add(proc);
2189f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                if (procStates != sortProcStates) {
21903ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                    computeProcessTimeLocked(proc, screenStates, memStates, sortProcStates, now);
2191c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                }
21923ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy            }
2193f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2194f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        Collections.sort(outProcs, new Comparator<ProcessState>() {
2195f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            @Override
2196f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            public int compare(ProcessState lhs, ProcessState rhs) {
2197f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) {
21983ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                    return -1;
21996b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) {
22007247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy                    return 1;
2201d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka                }
2202d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka                return 0;
22037247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy            }
2204df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy        });
2205abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka        return outProcs;
2206742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka    }
2207c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka
2208c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka    String collapseString(String pkgName, String itemName) {
2209742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka        if (itemName.startsWith(pkgName)) {
221011148e516524754e211e1a1e5e79d19b7d1a42a7Michael Jurka            final int ITEMLEN = itemName.length();
221111148e516524754e211e1a1e5e79d19b7d1a42a7Michael Jurka            final int PKGLEN = pkgName.length();
2212742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka            if (ITEMLEN == PKGLEN) {
2213742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                return "";
221461033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen            } else if (ITEMLEN >= PKGLEN) {
2215f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                if (itemName.charAt(PKGLEN) == '.') {
2216f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                    return itemName.substring(PKGLEN);
2217f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                }
2218f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            }
2219f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2220f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return itemName;
2221f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
2222f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
2223f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void dumpCheckinLocked(PrintWriter pw, String reqPackage) {
2224f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        final long now = SystemClock.uptimeMillis();
2225f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap();
2226f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen        pw.println("vers,4");
2227abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka        pw.print("period,"); pw.print(mTimePeriodStartClockStr);
2228abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka        pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(",");
2229bfadaad3522dc6b1cf3c95c08031ae088a3f610aMichael Jurka        pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime);
22308edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurka        boolean partial = true;
2231dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunne        if ((mFlags&FLAG_SHUTDOWN) != 0) {
2232b1254a6bdb11024042fb6c27e179210c1bbd6e1cChet Haase            pw.print(",shutdown");
2233df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy            partial = false;
2234df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy        }
2235df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy        if ((mFlags&FLAG_SYSPROPS) != 0) {
2236df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy            pw.print(",sysprops");
2237785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            partial = false;
2238df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy        }
22393c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka        if ((mFlags&FLAG_COMPLETE) != 0) {
22408edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurka            pw.print(",complete");
22413c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka            partial = false;
22423c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka        }
22433c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka        if (partial) {
22443c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka            pw.print(",partial");
22453c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka        }
2246abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka        pw.println();
2247abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka        pw.print("config,"); pw.print(mRuntime); pw.print(','); pw.println(mWebView);
22482763be3150d429d338b9848286e9365b4052c100Michael Jurka        for (int ip=0; ip<pkgMap.size(); ip++) {
224932174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung            final String pkgName = pkgMap.keyAt(ip);
225032174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung            if (reqPackage != null && !reqPackage.equals(pkgName)) {
225132174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung                continue;
225232174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung            }
225332174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung            final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip);
225432174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung            for (int iu=0; iu<uids.size(); iu++) {
22553c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka                final int uid = uids.keyAt(iu);
2256df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                final SparseArray<PackageState> vpkgs = uids.valueAt(iu);
22576b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                for (int iv=0; iv<vpkgs.size(); iv++) {
2258df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                    final int vers = vpkgs.keyAt(iv);
2259f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen                    final PackageState pkgState = vpkgs.valueAt(iv);
22606b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                    final int NPROCS = pkgState.mProcesses.size();
2261c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    final int NSRVS = pkgState.mServices.size();
2262c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    for (int iproc=0; iproc<NPROCS; iproc++) {
2263c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                        ProcessState proc = pkgState.mProcesses.valueAt(iproc);
2264c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                        pw.print("pkgproc,");
22656b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                        pw.print(pkgName);
2266df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                        pw.print(",");
2267df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                        pw.print(uid);
2268df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                        pw.print(",");
2269df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                        pw.print(vers);
2270df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                        pw.print(",");
2271785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                        pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
2272abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                        dumpAllProcessStateCheckin(pw, proc, now);
2273abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                        pw.println();
2274abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                        if (proc.mPssTableSize > 0) {
22753ac74c55cf8baef29db80e8c67ab4ab033b04417Winson Chung                            pw.print("pkgpss,");
2276c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                            pw.print(pkgName);
2277c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                            pw.print(",");
2278c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                            pw.print(uid);
2279c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                            pw.print(",");
2280c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                            pw.print(vers);
2281abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                            pw.print(",");
22826b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                            pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
22833ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                            dumpAllProcessPssCheckin(pw, proc);
22847247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy                            pw.println();
22853ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                        }
22863ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                        if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0
22873ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                                || proc.mNumCachedKill > 0) {
2288f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                            pw.print("pkgkills,");
22896b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                            pw.print(pkgName);
22903ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                            pw.print(",");
2291c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                            pw.print(uid);
22923ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                            pw.print(",");
2293f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen                            pw.print(vers);
2294f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                            pw.print(",");
2295f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                            pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
2296f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                            pw.print(",");
2297f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                            pw.print(proc.mNumExcessiveWake);
22982b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy                            pw.print(",");
22996b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                            pw.print(proc.mNumExcessiveCpu);
23003ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                            pw.print(",");
2301d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                            pw.print(proc.mNumCachedKill);
2302d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                            pw.print(",");
2303d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                            pw.print(proc.mMinCachedKillPss);
2304df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                            pw.print(":");
2305c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                            pw.print(proc.mAvgCachedKillPss);
2306c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                            pw.print(":");
230761033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen                            pw.print(proc.mMaxCachedKillPss);
2308742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                            pw.println();
2309742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                        }
2310742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                    }
2311742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                    for (int isvc=0; isvc<NSRVS; isvc++) {
2312742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                        String serviceName = collapseString(pkgName,
2313c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka                                pkgState.mServices.keyAt(isvc));
2314c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka                        ServiceState svc = pkgState.mServices.valueAt(isvc);
2315742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                        dumpServiceTimeCheckin(pw, "pkgsvc-run", pkgName, uid, vers, serviceName,
2316742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                                svc, ServiceState.SERVICE_RUN, svc.mRunCount,
2317742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                                svc.mRunState, svc.mRunStartTime, now);
2318742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                        dumpServiceTimeCheckin(pw, "pkgsvc-start", pkgName, uid, vers, serviceName,
2319742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                                svc, ServiceState.SERVICE_STARTED, svc.mStartedCount,
2320abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                                svc.mStartedState, svc.mStartedStartTime, now);
2321785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                        dumpServiceTimeCheckin(pw, "pkgsvc-bound", pkgName, uid, vers, serviceName,
2322ea57348cc8f4647f6bc35a42cd45662ddb828b92Michael Jurka                                svc, ServiceState.SERVICE_BOUND, svc.mBoundCount,
2323c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka                                svc.mBoundState, svc.mBoundStartTime, now);
2324c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka                        dumpServiceTimeCheckin(pw, "pkgsvc-exec", pkgName, uid, vers, serviceName,
2325742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                                svc, ServiceState.SERVICE_EXEC, svc.mExecCount,
2326742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                                svc.mExecState, svc.mExecStartTime, now);
2327742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                    }
2328742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka                }
2329abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka            }
2330abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka        }
23312763be3150d429d338b9848286e9365b4052c100Michael Jurka
23328edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurka        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
2333dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunne        for (int ip=0; ip<procMap.size(); ip++) {
233432174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung            String procName = procMap.keyAt(ip);
233532174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung            SparseArray<ProcessState> uids = procMap.valueAt(ip);
233632174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung            for (int iu=0; iu<uids.size(); iu++) {
233732174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung                int uid = uids.keyAt(iu);
233832174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung                ProcessState procState = uids.valueAt(iu);
233932174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung                if (procState.mDurationsTableSize > 0) {
234032174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung                    pw.print("proc,");
234132174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung                    pw.print(procName);
23428edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurka                    pw.print(",");
2343df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                    pw.print(uid);
2344abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                    dumpAllProcessStateCheckin(pw, procState, now);
2345abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                    pw.println();
23462763be3150d429d338b9848286e9365b4052c100Michael Jurka                }
2347df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                if (procState.mPssTableSize > 0) {
2348df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                    pw.print("pss,");
23496b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy                    pw.print(procName);
2350f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                    pw.print(",");
2351c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    pw.print(uid);
2352df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                    dumpAllProcessPssCheckin(pw, procState);
2353df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                    pw.println();
2354abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                }
2355abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0
2356abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                        || procState.mNumCachedKill > 0) {
23573ac74c55cf8baef29db80e8c67ab4ab033b04417Winson Chung                    pw.print("kills,");
2358c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                    pw.print(procName);
2359c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                    pw.print(",");
2360c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                    pw.print(uid);
2361c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                    pw.print(",");
2362c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                    pw.print(procState.mNumExcessiveWake);
2363abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                    pw.print(",");
2364df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy                    pw.print(procState.mNumExcessiveCpu);
23653ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy                    pw.print(",");
23667247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy                    pw.print(procState.mNumCachedKill);
2367c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    pw.print(",");
2368c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    pw.print(procState.mMinCachedKillPss);
2369c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    pw.print(":");
2370c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    pw.print(procState.mAvgCachedKillPss);
2371c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka                    pw.print(":");
23729c6de3d7c3e7d40e1e443b6fd69e3077ab9e9673Michael Jurka                    pw.print(procState.mMaxCachedKillPss);
23739c6de3d7c3e7d40e1e443b6fd69e3077ab9e9673Michael Jurka                    pw.println();
23749c6de3d7c3e7d40e1e443b6fd69e3077ab9e9673Michael Jurka                }
2375c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka            }
2376c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka        }
2377c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka        pw.print("total");
2378c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka        dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor,
2379f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                mStartTime, now);
2380c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka        pw.println();
2381c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka    }
23826b879f0a5885274a85333531e091283405d490ccAdam Lesinski
2383c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka    public static class DurationsTable {
2384c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka        public final ProcessStats mStats;
2385815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov        public final String mName;
23865fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung        public int[] mDurationsTable;
23875fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung        public int mDurationsTableSize;
23885fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung
23895fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung        public DurationsTable(ProcessStats stats, String name) {
2390815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov            mStats = stats;
2391815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov            mName = name;
239200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
239300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
2394d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        void copyDurationsTo(DurationsTable other) {
2395b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung            if (mDurationsTable != null) {
2396c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                mStats.mAddLongTable = new int[mDurationsTable.length];
2397b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung                mStats.mAddLongTableSize = 0;
2398c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                for (int i=0; i<mDurationsTableSize; i++) {
2399b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung                    int origEnt = mDurationsTable[i];
2400f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                    int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
2401d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                    int newOff = mStats.addLongData(i, type, 1);
2402557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                    mStats.mAddLongTable[i] = newOff | type;
2403557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                    mStats.setLong(newOff, 0, mStats.getLong(origEnt, 0));
2404557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                }
2405557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                other.mDurationsTable = mStats.mAddLongTable;
2406557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                other.mDurationsTableSize = mStats.mAddLongTableSize;
2407557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung            } else {
2408557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                other.mDurationsTable = null;
2409557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung                other.mDurationsTableSize = 0;
2410557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung            }
2411557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung        }
2412d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
2413b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung        void addDurations(DurationsTable other) {
2414d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka            for (int i=0; i<other.mDurationsTableSize; i++) {
2415b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung                int ent = other.mDurationsTable[i];
2416b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung                int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
2417f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                if (DEBUG) Slog.d(TAG, "Adding state " + state + " duration "
2418f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                        + other.mStats.getLong(ent, 0));
2419f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                addDuration(state, other.mStats.getLong(ent, 0));
2420f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            }
2421f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
24223d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
2423f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        void resetDurationsSafely() {
24243d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            mDurationsTable = null;
2425f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            mDurationsTableSize = 0;
2426f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2427f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
24283d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        void writeDurationsToParcel(Parcel out) {
2429f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            out.writeInt(mDurationsTableSize);
24303d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            for (int i=0; i<mDurationsTableSize; i++) {
2431f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": "
2432f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                        + printLongOffset(mDurationsTable[i]));
2433f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                out.writeInt(mDurationsTable[i]);
2434f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            }
2435f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
24363d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
2437f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        boolean readDurationsFromParcel(Parcel in) {
24383d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            mDurationsTable = mStats.readTableFromParcel(in, mName, "durations");
2439f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            if (mDurationsTable == BAD_TABLE) {
2440f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                return false;
2441f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            }
24423d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0;
2443f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            return true;
24443d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        }
2445f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
2446b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung        void addDuration(int state, long dur) {
2447d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
2448d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            int off;
2449785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            if (idx >= 0) {
2450785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                off = mDurationsTable[idx];
2451785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            } else {
2452f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                mStats.mAddLongTable = mDurationsTable;
2453f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                mStats.mAddLongTableSize = mDurationsTableSize;
2454785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                off = mStats.addLongData(~idx, state, 1);
24553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                mDurationsTable = mStats.mAddLongTable;
2456f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                mDurationsTableSize = mStats.mAddLongTableSize;
24573d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            }
2458785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
2459f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            if (DEBUG) Slog.d(TAG, "Duration of " + mName + " state " + state + " inc by " + dur
2460f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung                    + " from " + longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK]);
2461785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += dur;
2462785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        }
2463785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
2464785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        long getDuration(int state, long now) {
2465785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
2466785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            return idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0;
2467785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        }
2468785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung    }
2469785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
2470b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato    public static final class ProcessState extends DurationsTable {
24717e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato        public ProcessState mCommonProcess;
2472b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        public final String mPackage;
2473b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        public final int mUid;
2474b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        public final int mVersion;
2475b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato
247634a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato        //final long[] mDurations = new long[STATE_COUNT*ADJ_COUNT];
247734a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato        int mCurState = STATE_NOTHING;
2478b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        long mStartTime;
247934a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato
248034a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato        int mLastPssState = STATE_NOTHING;
2481b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        long mLastPssTime;
2482b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        int[] mPssTable;
2483b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        int mPssTableSize;
2484b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato
2485b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        boolean mActive;
2486b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        int mNumActiveServices;
24877e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato        int mNumStartedServices;
24887e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato
24897e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato        int mNumExcessiveWake;
24907e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato        int mNumExcessiveCpu;
2491b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato
2492b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        int mNumCachedKill;
2493b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        long mMinCachedKillPss;
2494b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        long mAvgCachedKillPss;
2495b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        long mMaxCachedKillPss;
2496b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato
2497b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        boolean mMultiPackage;
2498b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        boolean mDead;
24997e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato
25007e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato        public long mTmpTotalTime;
250134a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato        int mTmpNumInUse;
25027e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato        ProcessState mTmpFoundSubProc;
25037e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato
2504effc4a8aef606503287dc42d1f7c0feb16e12035Joe Onorato        /**
2505effc4a8aef606503287dc42d1f7c0feb16e12035Joe Onorato         * Create a new top-level process state, for the initial case where there is only
2506effc4a8aef606503287dc42d1f7c0feb16e12035Joe Onorato         * a single package running in a process.  The initial state is not running.
2507effc4a8aef606503287dc42d1f7c0feb16e12035Joe Onorato         */
2508b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        public ProcessState(ProcessStats processStats, String pkg, int uid, int vers, String name) {
25097bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato            super(processStats, name);
2510f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            mCommonProcess = this;
2511f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            mPackage = pkg;
2512f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            mUid = uid;
2513785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            mVersion = vers;
25143d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        }
2515f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
25163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        /**
2517785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung         * Create a new per-package process state for an existing top-level process
2518f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung         * state.  The current running state of the top-level process is also copied,
25193d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung         * marked as started running at 'now'.
25203d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung         */
25213d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        public ProcessState(ProcessState commonProcess, String pkg, int uid, int vers, String name,
2522e77c08d15f23c403293dbb40c6a36967de822c89Joe Onorato                long now) {
25237404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato            super(commonProcess.mStats, name);
25247404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato            mCommonProcess = commonProcess;
25257c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato            mPackage = pkg;
25267c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato            mUid = uid;
25277c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato            mVersion = vers;
25287c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato            mCurState = commonProcess.mCurState;
25297c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato            mStartTime = now;
25307c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato        }
25317c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato
25327c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato        ProcessState clone(String pkg, long now) {
25335f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy            ProcessState pnew = new ProcessState(this, pkg, mUid, mVersion, mName, now);
25345f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy            copyDurationsTo(pnew);
25355f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy            if (mPssTable != null) {
25365f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy                mStats.mAddLongTable = new int[mPssTable.length];
25375f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy                mStats.mAddLongTableSize = 0;
25386b4b25d093b0a3008d6e275438c79db9c21daab9Michael Jurka                for (int i=0; i<mPssTableSize; i++) {
25396b4b25d093b0a3008d6e275438c79db9c21daab9Michael Jurka                    int origEnt = mPssTable[i];
25405f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy                    int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
25415f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy                    int newOff = mStats.addLongData(i, type, PSS_COUNT);
2542213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka                    mStats.mAddLongTable[i] = newOff | type;
25436b4b25d093b0a3008d6e275438c79db9c21daab9Michael Jurka                    for (int j=0; j<PSS_COUNT; j++) {
25442b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy                        mStats.setLong(newOff, j, mStats.getLong(origEnt, j));
2545fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                    }
25460423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka                }
2547ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy                pnew.mPssTable = mStats.mAddLongTable;
25480423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka                pnew.mPssTableSize = mStats.mAddLongTableSize;
25490423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            }
25500423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            pnew.mNumExcessiveWake = mNumExcessiveWake;
25510423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            pnew.mNumExcessiveCpu = mNumExcessiveCpu;
25520423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            pnew.mNumCachedKill = mNumCachedKill;
25530423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            pnew.mMinCachedKillPss = mMinCachedKillPss;
25540423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            pnew.mAvgCachedKillPss = mAvgCachedKillPss;
2555fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            pnew.mMaxCachedKillPss = mMaxCachedKillPss;
2556ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy            pnew.mActive = mActive;
25570423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            pnew.mNumActiveServices = mNumActiveServices;
25580423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            pnew.mNumStartedServices = mNumStartedServices;
2559b6052a9a0c7b57f0f4bd6c2b0c9b3280f0b1ed5bMichael Jurka            return pnew;
2560b6052a9a0c7b57f0f4bd6c2b0c9b3280f0b1ed5bMichael Jurka        }
2561b6052a9a0c7b57f0f4bd6c2b0c9b3280f0b1ed5bMichael Jurka
256270d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood        void add(ProcessState other) {
256370d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood            addDurations(other);
256470d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood            for (int i=0; i<other.mPssTableSize; i++) {
256570d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood                int ent = other.mPssTable[i];
25660423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka                int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
2567fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                addPss(state, (int) other.mStats.getLong(ent, PSS_SAMPLE_COUNT),
2568fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                        other.mStats.getLong(ent, PSS_MINIMUM),
2569fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                        other.mStats.getLong(ent, PSS_AVERAGE),
2570fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                        other.mStats.getLong(ent, PSS_MAXIMUM),
2571fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                        other.mStats.getLong(ent, PSS_USS_MINIMUM),
2572fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                        other.mStats.getLong(ent, PSS_USS_AVERAGE),
2573fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                        other.mStats.getLong(ent, PSS_USS_MAXIMUM));
2574fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            }
2575fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            mNumExcessiveWake += other.mNumExcessiveWake;
2576fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            mNumExcessiveCpu += other.mNumExcessiveCpu;
2577fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            if (other.mNumCachedKill > 0) {
2578fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss,
2579fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                        other.mAvgCachedKillPss, other.mMaxCachedKillPss);
2580fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            }
2581fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung        }
2582fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung
2583fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung        void resetSafely(long now) {
2584fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            resetDurationsSafely();
2585fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            mStartTime = now;
2586fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            mLastPssState = STATE_NOTHING;
2587fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            mLastPssTime = 0;
2588fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            mPssTable = null;
2589fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            mPssTableSize = 0;
2590fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            mNumExcessiveWake = 0;
2591fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            mNumExcessiveCpu = 0;
25920423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            mNumCachedKill = 0;
25930423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
25940423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka        }
25954ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka
25960423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka        void makeDead() {
25970423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            mDead = true;
2598e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka        }
25990423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka
26000423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka        private void ensureNotDead() {
26010423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            if (!mDead) {
2602fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                return;
2603fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            }
2604fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung            Slog.wtfStack(TAG, "ProcessState dead: name=" + mName
2605fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                    + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName);
2606fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung        }
2607e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka
26084ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka        void writeToParcel(Parcel out, long now) {
2609e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka            out.writeInt(mMultiPackage ? 1 : 0);
26104ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka            writeDurationsToParcel(out);
26114ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka            out.writeInt(mPssTableSize);
26120423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            for (int i=0; i<mPssTableSize; i++) {
26131cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung                if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": "
26141cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung                        + printLongOffset(mPssTable[i]));
261597d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung                out.writeInt(mPssTable[i]);
26161cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            }
26171cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            out.writeInt(mNumExcessiveWake);
26181cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            out.writeInt(mNumExcessiveCpu);
26191cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            out.writeInt(mNumCachedKill);
262068524cdd8c5c0fdd2a6ea92956eab033f0585dd9Mathew Inwood            if (mNumCachedKill > 0) {
2621649723cfb3d73af16dd02462725700897ca60e38Winson Chung                out.writeLong(mMinCachedKillPss);
26221cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung                out.writeLong(mAvgCachedKillPss);
2623649723cfb3d73af16dd02462725700897ca60e38Winson Chung                out.writeLong(mMaxCachedKillPss);
26241cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            }
26251cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung        }
2626649723cfb3d73af16dd02462725700897ca60e38Winson Chung
26276d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani        boolean readFromParcel(Parcel in, boolean fully) {
26286d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            boolean multiPackage = in.readInt() != 0;
26296d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            if (fully) {
2630e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka                mMultiPackage = multiPackage;
26314ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka            }
26324ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka            if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table...");
26334ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka            if (!readDurationsFromParcel(in)) {
26346d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                return false;
26351cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            }
26361cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table...");
26371cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            mPssTable = mStats.readTableFromParcel(in, mName, "pss");
26381cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            if (mPssTable == BAD_TABLE) {
26391cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung                return false;
26401cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            }
26411cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            mPssTableSize = mPssTable != null ? mPssTable.length : 0;
2642649723cfb3d73af16dd02462725700897ca60e38Winson Chung            mNumExcessiveWake = in.readInt();
2643649723cfb3d73af16dd02462725700897ca60e38Winson Chung            mNumExcessiveCpu = in.readInt();
26441cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            mNumCachedKill = in.readInt();
26451cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung            if (mNumCachedKill > 0) {
2646649723cfb3d73af16dd02462725700897ca60e38Winson Chung                mMinCachedKillPss = in.readLong();
26471cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung                mAvgCachedKillPss = in.readLong();
2648ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy                mMaxCachedKillPss = in.readLong();
26496ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka            } else {
26500423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka                mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
2651e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka            }
26524ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka            return true;
26534ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka        }
26544ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka
26556ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka        public void makeActive() {
2656eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung            ensureNotDead();
26576ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka            mActive = true;
26586ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka        }
2659785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
2660785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        public void makeInactive() {
2661785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            mActive = false;
2662785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        }
2663785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
26646a26e5bed48bf64996aef3ea1db4767ee147640eWinson Chung        public boolean isInUse() {
2665785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            return mActive || mNumActiveServices > 0 || mNumStartedServices > 0
2666785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                    || mCurState != STATE_NOTHING;
2667967289b6d5fec77f5c381d11ffb2319f3bb5e737Winson Chung        }
2668785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
2669eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung        /**
2670eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung         * Update the current state of the given list of processes.
2671eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung         *
2672eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung         * @param state Current ActivityManager.PROCESS_STATE_*
2673eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung         * @param memFactor Current mem factor constant.
2674785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung         * @param now Current time.
2675785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung         * @param pkgList Processes to update.
2676785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung         */
2677785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        public void setState(int state, int memFactor, long now,
2678785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                ArrayMap<String, ProcessState> pkgList) {
26790423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka            if (state < 0) {
2680ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy                state = mNumStartedServices > 0
2681ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy                        ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING;
2682e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka            } else {
2683fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung                state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT);
26844ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka            }
26854ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka
2686ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy            // First update the common process.
268731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            mCommonProcess.setState(state, now);
268831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
268931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            // If the common process is not multi-package, there is nothing else to do.
2690c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            if (!mCommonProcess.mMultiPackage) {
26917b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy                return;
26927b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy            }
26937b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy
269431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (pkgList != null) {
26959ffb5439b6e2ffb972086fd237fb3ded3d29ab50Romain Guy                for (int ip=pkgList.size()-1; ip>=0; ip--) {
269631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    pullFixedProc(pkgList, ip).setState(state, now);
269731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                }
2698cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy            }
269955b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung        }
270055b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung
270131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        void setState(int state, long now) {
2702c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            ensureNotDead();
2703cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy            if (mCurState != state) {
270431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state);
270531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                commitStateTime(now);
2706cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                mCurState = state;
27077b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy            }
270831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
270931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
271031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        void commitStateTime(long now) {
271131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (mCurState != STATE_NOTHING) {
271231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                long dur = now - mStartTime;
271331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                if (dur > 0) {
271431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    addDuration(mCurState, dur);
271531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                }
271631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
2717cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy            mStartTime = now;
271855b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung        }
271955b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung
2720cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy        void incActiveServices(String serviceName) {
2721cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy            if (DEBUG && "".equals(mName)) {
272231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                RuntimeException here = new RuntimeException("here");
2723cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato                here.fillInStackTrace();
2724cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato                Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName
2725cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato                        + " to " + (mNumActiveServices+1), here);
2726cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato            }
2727cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato            if (mCommonProcess != this) {
272831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                mCommonProcess.incActiveServices(serviceName);
272931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
2730c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            mNumActiveServices++;
2731c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey        }
2732c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey
2733c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey        void decActiveServices(String serviceName) {
2734c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            if (DEBUG && "".equals(mName)) {
2735cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                RuntimeException here = new RuntimeException("here");
273655b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung                here.fillInStackTrace();
273755b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung                Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName
2738c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                        + " to " + (mNumActiveServices-1), here);
2739d294526ad99db70d882a1e11f2b0f878524163faWinson Chung            }
2740d294526ad99db70d882a1e11f2b0f878524163faWinson Chung            if (mCommonProcess != this) {
2741d294526ad99db70d882a1e11f2b0f878524163faWinson Chung                mCommonProcess.decActiveServices(serviceName);
2742d294526ad99db70d882a1e11f2b0f878524163faWinson Chung            }
2743c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            mNumActiveServices--;
2744c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            if (mNumActiveServices < 0) {
274555b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung                Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage
274655b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung                        + " uid=" + mUid + " proc=" + mName + " service=" + serviceName);
274755b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung                mNumActiveServices = 0;
274855b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung            }
274955b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung        }
275055b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung
275155b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung        void incStartedServices(int memFactor, long now, String serviceName) {
2752c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            if (false) {
275355b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung                RuntimeException here = new RuntimeException("here");
275455b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung                here.fillInStackTrace();
275555b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung                Slog.d(TAG, "incStartedServices: " + this + " service=" + serviceName
275655b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung                        + " to " + (mNumStartedServices+1), here);
2757c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            }
2758c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            if (mCommonProcess != this) {
2759c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey                mCommonProcess.incStartedServices(memFactor, now, serviceName);
2760c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            }
2761c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            mNumStartedServices++;
2762c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey            if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) {
276331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                setState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now);
276431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
27657b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy        }
27667b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy
2767aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung        void decStartedServices(int memFactor, long now, String serviceName) {
27687b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy            if (false) {
276931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                RuntimeException here = new RuntimeException("here");
277031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                here.fillInStackTrace();
277131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName
27722ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato                        + " to " + (mNumStartedServices-1), here);
27732ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato            }
27742ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato            if (mCommonProcess != this) {
27752ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato                mCommonProcess.decStartedServices(memFactor, now, serviceName);
27762ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato            }
27772ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato            mNumStartedServices--;
2778b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato            if (mNumStartedServices == 0 && (mCurState%STATE_COUNT) == STATE_SERVICE_RESTARTING) {
2779b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato                setState(STATE_NOTHING, now);
2780b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato            } else if (mNumStartedServices < 0) {
278134a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato                Slog.wtfStack(TAG, "Proc started services underrun: pkg="
2782b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato                        + mPackage + " uid=" + mUid + " name=" + mName);
2783b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato                mNumStartedServices = 0;
2784c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka            }
2785b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato        }
27862ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato
27872ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato        public void addPss(long pss, long uss, boolean always,
27882ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato                ArrayMap<String, ProcessState> pkgList) {
27892ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato            ensureNotDead();
27901e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey            if (!always) {
27911e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                if (mLastPssState == mCurState && SystemClock.uptimeMillis()
27921e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                        < (mLastPssTime+(30*1000))) {
27931e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                    return;
27941e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                }
27951e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey            }
27961e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey            mLastPssState = mCurState;
27971e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey            mLastPssTime = SystemClock.uptimeMillis();
27981e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey            if (mCurState != STATE_NOTHING) {
27991e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                // First update the common process.
28001e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                mCommonProcess.addPss(mCurState, 1, pss, pss, pss, uss, uss, uss);
28011e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey
28021e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                // If the common process is not multi-package, there is nothing else to do.
28031e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey                if (!mCommonProcess.mMultiPackage) {
2804ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                    return;
2805ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                }
2806ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato
2807ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                if (pkgList != null) {
2808ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                    for (int ip=pkgList.size()-1; ip>=0; ip--) {
2809ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                        pullFixedProc(pkgList, ip).addPss(mCurState, 1,
2810ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                                pss, pss, pss, uss, uss, uss);
2811ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                    }
2812ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                }
2813ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            }
2814ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato        }
2815ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato
2816ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato        void addPss(int state, int inCount, long minPss, long avgPss, long maxPss, long minUss,
2817ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                long avgUss, long maxUss) {
2818ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            int idx = binarySearch(mPssTable, mPssTableSize, state);
2819ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            int off;
2820ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            if (idx >= 0) {
2821ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                off = mPssTable[idx];
2822ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            } else {
2823ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                mStats.mAddLongTable = mPssTable;
2824ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                mStats.mAddLongTableSize = mPssTableSize;
2825ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                off = mStats.addLongData(~idx, state, PSS_COUNT);
2826ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                mPssTable = mStats.mAddLongTable;
2827ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                mPssTableSize = mStats.mAddLongTableSize;
28289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
282931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
28309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK;
2831d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato            long count = longs[idx+PSS_SAMPLE_COUNT];
28320142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka            if (count == 0) {
2833d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato                longs[idx+PSS_SAMPLE_COUNT] = inCount;
2834d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato                longs[idx+PSS_MINIMUM] = minPss;
2835d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato                longs[idx+PSS_AVERAGE] = avgPss;
28369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                longs[idx+PSS_MAXIMUM] = maxPss;
2837f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project                longs[idx+PSS_USS_MINIMUM] = minUss;
28382b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy                longs[idx+PSS_USS_AVERAGE] = avgUss;
28399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                longs[idx+PSS_USS_MAXIMUM] = maxUss;
28409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            } else {
28419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                longs[idx+PSS_SAMPLE_COUNT] = count+inCount;
28429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                if (longs[idx+PSS_MINIMUM] > minPss) {
28439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    longs[idx+PSS_MINIMUM] = minPss;
28449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                }
28459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                longs[idx+PSS_AVERAGE] = (long)(
2846df0353815c629fc678824b07a234b89a1ff94208Adam Cohen                        ((longs[idx+PSS_AVERAGE]*(double)count)+(avgPss*(double)inCount))
2847df0353815c629fc678824b07a234b89a1ff94208Adam Cohen                                / (count+inCount) );
28489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                if (longs[idx+PSS_MAXIMUM] < maxPss) {
28499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    longs[idx+PSS_MAXIMUM] = maxPss;
28503c2f7e105d8daab439bff2c362a727ad348d8a44Joe Onorato                }
28517a25a9e39a13df706daeb0a4a82273f3c5151997Winson Chung                if (longs[idx+PSS_USS_MINIMUM] > minUss) {
28527a25a9e39a13df706daeb0a4a82273f3c5151997Winson Chung                    longs[idx+PSS_USS_MINIMUM] = minUss;
28539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                }
28543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                longs[idx+PSS_USS_AVERAGE] = (long)(
28553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                        ((longs[idx+PSS_USS_AVERAGE]*(double)count)+(avgUss*(double)inCount))
285631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                                / (count+inCount) );
2857f5d77c9e3fb9238b52f53b57eaa7ad01a1328e25Adam Cohen                if (longs[idx+PSS_USS_MAXIMUM] < maxUss) {
28584eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen                    longs[idx+PSS_USS_MAXIMUM] = maxUss;
28593d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                }
286031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
286131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
286231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
28639c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        public void reportExcessiveWake(ArrayMap<String, ProcessState> pkgList) {
28649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            ensureNotDead();
28659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            mCommonProcess.mNumExcessiveWake++;
286631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (!mCommonProcess.mMultiPackage) {
28679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                return;
2868ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            }
2869ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato
28709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            for (int ip=pkgList.size()-1; ip>=0; ip--) {
28719c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                pullFixedProc(pkgList, ip).mNumExcessiveWake++;
28729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
28739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
28749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
28759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        public void reportExcessiveCpu(ArrayMap<String, ProcessState> pkgList) {
28763d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            ensureNotDead();
28773d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            mCommonProcess.mNumExcessiveCpu++;
28783d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            if (!mCommonProcess.mMultiPackage) {
28799c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                return;
2880df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen            }
28813d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung
28820142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka            for (int ip=pkgList.size()-1; ip>=0; ip--) {
2883df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen                pullFixedProc(pkgList, ip).mNumExcessiveCpu++;
28843d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung            }
28853d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung        }
28869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
28879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        private void addCachedKill(int num, long minPss, long avgPss, long maxPss) {
288831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (mNumCachedKill <= 0) {
28899c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                mNumCachedKill = num;
28909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                mMinCachedKillPss = minPss;
28919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                mAvgCachedKillPss = avgPss;
28929c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                mMaxCachedKillPss = maxPss;
28939c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            } else {
28949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                if (minPss < mMinCachedKillPss) {
2895ad72e1705c32da463a552f2283ae467dc15a4a34Joe Onorato                    mMinCachedKillPss = minPss;
2896ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                }
2897319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                if (maxPss > mMaxCachedKillPss) {
2898319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick                    mMaxCachedKillPss = maxPss;
289931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                }
290031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                mAvgCachedKillPss = (long)( ((mAvgCachedKillPss*(double)mNumCachedKill) + avgPss)
29019c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        / (mNumCachedKill+num) );
29029c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                mNumCachedKill += num;
29039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
29049c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
29059c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
29069c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        public void reportCachedKill(ArrayMap<String, ProcessState> pkgList, long pss) {
2907ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            ensureNotDead();
2908ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            mCommonProcess.addCachedKill(1, pss, pss, pss);
2909843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler            if (!mCommonProcess.mMultiPackage) {
2910843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler                return;
2911843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler            }
2912843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler
29139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            for (int ip=pkgList.size()-1; ip>=0; ip--) {
2914cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                pullFixedProc(pkgList, ip).addCachedKill(1, pss, pss, pss);
29159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
29169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
2917843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler
2918843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler        ProcessState pullFixedProc(String pkgName) {
2919843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler            if (mMultiPackage) {
2920843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler                // The array map is still pointing to a common process state
29219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                // that is now shared across packages.  Update it to point to
292231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                // the new per-package state.
29239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgName, mUid);
29249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                if (vpkg == null) {
292531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    throw new IllegalStateException("Didn't find package " + pkgName
29263d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung                            + " / " + mUid);
29279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                }
292831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                PackageState pkg = vpkg.get(mVersion);
2929ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                if (pkg == null) {
2930ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen                    throw new IllegalStateException("Didn't find package " + pkgName
29319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                            + " / " + mUid + " vers " + mVersion);
2932cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                }
2933843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler                ProcessState proc = pkg.mProcesses.get(mName);
2934843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler                if (proc == null) {
2935843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler                    throw new IllegalStateException("Didn't create per-package process "
2936843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler                            + mName + " in pkg " + pkgName + " / " + mUid + " vers " + mVersion);
29379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                }
2938cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                return proc;
29399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
29409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            return this;
29419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
29429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
29439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        private ProcessState pullFixedProc(ArrayMap<String, ProcessState> pkgList, int index) {
29449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            ProcessState proc = pkgList.valueAt(index);
2945ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            if (mDead && proc.mCommonProcess != proc) {
2946ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato                // Somehow we are contining to use a process state that is dead, because
29479c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                // it was not being told it was active during the last commit.  We can recover
29489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                // from this by generating a fresh new state, but this is bad because we
29490142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka                // are losing whatever data we had in the old process state.
29509c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                Log.wtf(TAG, "Pulling dead proc: name=" + mName + " pkg=" + mPackage
29519c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        + " uid=" + mUid + " common.name=" + mCommonProcess.mName);
2952138a04170d964da9cdec228e95b976875ae52481Karl Rosaen                proc = mStats.getProcessStateLocked(proc.mPackage, proc.mUid, proc.mVersion,
2953cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                        proc.mName);
29549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
29559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            if (proc.mMultiPackage) {
29569c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                // The array map is still pointing to a common process state
295799c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey                // that is now shared across packages.  Update it to point to
2958cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy                // the new per-package state.
29599c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgList.keyAt(index),
2960002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                        proc.mUid);
2961002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                if (vpkg == null) {
2962002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                    throw new IllegalStateException("No existing package "
2963002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                            + pkgList.keyAt(index) + "/" + proc.mUid
2964002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                            + " for multi-proc " + proc.mName);
2965002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                }
2966002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy                PackageState pkg = vpkg.get(proc.mVersion);
29679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                if (pkg == null) {
296899c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey                    throw new IllegalStateException("No existing package "
29699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                            + pkgList.keyAt(index) + "/" + proc.mUid
29706d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                            + " for multi-proc " + proc.mName + " version " + proc.mVersion);
29716d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                }
29726d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                proc = pkg.mProcesses.get(proc.mName);
29736d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                if (proc == null) {
29746d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                    throw new IllegalStateException("Didn't create per-package process "
29756d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                            + proc.mName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid);
29766d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                }
29776d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani                pkgList.setValueAt(index, proc);
2978cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath            }
2979cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath            return proc;
2980cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath        }
2981cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath
2982cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath        long getDuration(int state, long now) {
29836d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            long time = super.getDuration(state, now);
29849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            if (mCurState == state) {
29859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                time += now - mStartTime;
29869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
29879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            return time;
29889c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
2989785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
2990785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        long getPssSampleCount(int state) {
2991785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            int idx = binarySearch(mPssTable, mPssTableSize, state);
29926d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_SAMPLE_COUNT) : 0;
2993cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath        }
29949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
2995cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy        long getPssMinimum(int state) {
29969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            int idx = binarySearch(mPssTable, mPssTableSize, state);
29979c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MINIMUM) : 0;
29989c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
29999c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
30009c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        long getPssAverage(int state) {
300164e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato            int idx = binarySearch(mPssTable, mPssTableSize, state);
3002ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_AVERAGE) : 0;
30039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
3004f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
3005785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        long getPssMaximum(int state) {
3006785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            int idx = binarySearch(mPssTable, mPssTableSize, state);
3007785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MAXIMUM) : 0;
30086d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani        }
30099c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
30109c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        long getPssUssMinimum(int state) {
30119c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            int idx = binarySearch(mPssTable, mPssTableSize, state);
30129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MINIMUM) : 0;
30139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
30149c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
30159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        long getPssUssAverage(int state) {
301664e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato            int idx = binarySearch(mPssTable, mPssTableSize, state);
3017ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_AVERAGE) : 0;
30189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
3019f5afda70648505aadde6fbd64b06c9724a33460cPatrick Dubroy
3020f5afda70648505aadde6fbd64b06c9724a33460cPatrick Dubroy        long getPssUssMaximum(int state) {
3021f5afda70648505aadde6fbd64b06c9724a33460cPatrick Dubroy            int idx = binarySearch(mPssTable, mPssTableSize, state);
3022f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0;
3023785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        }
3024785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
3025785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        public String toString() {
30266d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani            StringBuilder sb = new StringBuilder(128);
30279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this)))
30289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    .append(" ").append(mName).append("/").append(mUid)
30299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    .append(" pkg=").append(mPackage);
30309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            if (mMultiPackage) sb.append(" (multi)");
30319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            if (mCommonProcess != this) sb.append(" (sub)");
30329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            sb.append("}");
30339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            return sb.toString();
30343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato        }
30359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
30363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato
30373611578579b4bfb25616085dafdb1a45207394f9Joe Onorato    public static final class ServiceState extends DurationsTable {
30383611578579b4bfb25616085dafdb1a45207394f9Joe Onorato        public final String mPackage;
3039f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        public final String mProcessName;
3040785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        ProcessState mProc;
3041785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
3042785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        Object mOwner;
30436d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani
304431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        public static final int SERVICE_RUN = 0;
3045be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        public static final int SERVICE_STARTED = 1;
3046be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        public static final int SERVICE_BOUND = 2;
304780baf5a6b3c62a62265f626d43d1167783c94131Winson Chung        public static final int SERVICE_EXEC = 3;
304880baf5a6b3c62a62265f626d43d1167783c94131Winson Chung        static final int SERVICE_COUNT = 4;
304980baf5a6b3c62a62265f626d43d1167783c94131Winson Chung
3050f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        int mRunCount;
3051785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        public int mRunState = STATE_NOTHING;
3052785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung        long mRunStartTime;
3053785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung
305480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung        boolean mStarted;
305580baf5a6b3c62a62265f626d43d1167783c94131Winson Chung        boolean mRestarting;
3056400438b79fe412cb625c96297edeea9c6155349eWinson Chung        int mStartedCount;
3057400438b79fe412cb625c96297edeea9c6155349eWinson Chung        public int mStartedState = STATE_NOTHING;
3058400438b79fe412cb625c96297edeea9c6155349eWinson Chung        long mStartedStartTime;
3059400438b79fe412cb625c96297edeea9c6155349eWinson Chung
3060400438b79fe412cb625c96297edeea9c6155349eWinson Chung        int mBoundCount;
3061400438b79fe412cb625c96297edeea9c6155349eWinson Chung        public int mBoundState = STATE_NOTHING;
3062400438b79fe412cb625c96297edeea9c6155349eWinson Chung        long mBoundStartTime;
3063400438b79fe412cb625c96297edeea9c6155349eWinson Chung
3064400438b79fe412cb625c96297edeea9c6155349eWinson Chung        int mExecCount;
3065400438b79fe412cb625c96297edeea9c6155349eWinson Chung        public int mExecState = STATE_NOTHING;
3066400438b79fe412cb625c96297edeea9c6155349eWinson Chung        long mExecStartTime;
3067400438b79fe412cb625c96297edeea9c6155349eWinson Chung
3068400438b79fe412cb625c96297edeea9c6155349eWinson Chung        public ServiceState(ProcessStats processStats, String pkg, String name,
3069400438b79fe412cb625c96297edeea9c6155349eWinson Chung                String processName, ProcessState proc) {
3070400438b79fe412cb625c96297edeea9c6155349eWinson Chung            super(processStats, name);
3071400438b79fe412cb625c96297edeea9c6155349eWinson Chung            mPackage = pkg;
3072400438b79fe412cb625c96297edeea9c6155349eWinson Chung            mProcessName = processName;
3073400438b79fe412cb625c96297edeea9c6155349eWinson Chung            mProc = proc;
3074400438b79fe412cb625c96297edeea9c6155349eWinson Chung        }
3075400438b79fe412cb625c96297edeea9c6155349eWinson Chung
3076400438b79fe412cb625c96297edeea9c6155349eWinson Chung        public void applyNewOwner(Object newOwner) {
3077400438b79fe412cb625c96297edeea9c6155349eWinson Chung            if (mOwner != newOwner) {
3078400438b79fe412cb625c96297edeea9c6155349eWinson Chung                if (mOwner == null) {
3079400438b79fe412cb625c96297edeea9c6155349eWinson Chung                    mOwner = newOwner;
3080400438b79fe412cb625c96297edeea9c6155349eWinson Chung                    mProc.incActiveServices(mName);
3081400438b79fe412cb625c96297edeea9c6155349eWinson Chung                } else {
3082400438b79fe412cb625c96297edeea9c6155349eWinson Chung                    // There was already an old owner, reset this object for its
3083400438b79fe412cb625c96297edeea9c6155349eWinson Chung                    // new owner.
3084400438b79fe412cb625c96297edeea9c6155349eWinson Chung                    mOwner = newOwner;
3085400438b79fe412cb625c96297edeea9c6155349eWinson Chung                    if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) {
3086400438b79fe412cb625c96297edeea9c6155349eWinson Chung                        long now = SystemClock.uptimeMillis();
3087400438b79fe412cb625c96297edeea9c6155349eWinson Chung                        if (mStarted) {
3088400438b79fe412cb625c96297edeea9c6155349eWinson Chung                            if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
3089400438b79fe412cb625c96297edeea9c6155349eWinson Chung                                    + " from " + mOwner + " while started: pkg="
3090400438b79fe412cb625c96297edeea9c6155349eWinson Chung                                    + mPackage + " service=" + mName + " proc=" + mProc);
3091400438b79fe412cb625c96297edeea9c6155349eWinson Chung                            setStarted(false, 0, now);
3092400438b79fe412cb625c96297edeea9c6155349eWinson Chung                        }
3093400438b79fe412cb625c96297edeea9c6155349eWinson Chung                        if (mBoundState != STATE_NOTHING) {
3094400438b79fe412cb625c96297edeea9c6155349eWinson Chung                            if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
3095400438b79fe412cb625c96297edeea9c6155349eWinson Chung                                    + " from " + mOwner + " while bound: pkg="
3096400438b79fe412cb625c96297edeea9c6155349eWinson Chung                                    + mPackage + " service=" + mName + " proc=" + mProc);
3097400438b79fe412cb625c96297edeea9c6155349eWinson Chung                            setBound(false, 0, now);
3098400438b79fe412cb625c96297edeea9c6155349eWinson Chung                        }
309980baf5a6b3c62a62265f626d43d1167783c94131Winson Chung                        if (mExecState != STATE_NOTHING) {
3100be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato                            if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
3101be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato                                    + " from " + mOwner + " while executing: pkg="
3102be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato                                    + mPackage + " service=" + mName + " proc=" + mProc);
3103be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato                            setExecuting(false, 0, now);
310439bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato                        }
310539bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato                    }
310639bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato                }
310739bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato            }
310839bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato        }
3109319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick
3110be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        public void clearCurrentOwner(Object owner, boolean silently) {
3111f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            if (mOwner == owner) {
3112785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                mProc.decActiveServices(mName);
3113785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) {
3114785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung                    long now = SystemClock.uptimeMillis();
3115be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato                    if (mStarted) {
3116be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato                        if (!silently) {
311731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                            Slog.wtfStack(TAG, "Service owner " + owner
31182763be3150d429d338b9848286e9365b4052c100Michael Jurka                                    + " cleared while started: pkg=" + mPackage + " service="
3119abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                                    + mName + " proc=" + mProc);
3120abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                        }
3121abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka                        setStarted(false, 0, now);
31222763be3150d429d338b9848286e9365b4052c100Michael Jurka                    }
3123                    if (mBoundState != STATE_NOTHING) {
3124                        if (!silently) {
3125                            Slog.wtfStack(TAG, "Service owner " + owner
3126                                    + " cleared while bound: pkg=" + mPackage + " service="
3127                                    + mName + " proc=" + mProc);
3128                        }
3129                        setBound(false, 0, now);
3130                    }
3131                    if (mExecState != STATE_NOTHING) {
3132                        if (!silently) {
3133                            Slog.wtfStack(TAG, "Service owner " + owner
3134                                    + " cleared while exec: pkg=" + mPackage + " service="
3135                                    + mName + " proc=" + mProc);
3136                        }
3137                        setExecuting(false, 0, now);
3138                    }
3139                }
3140                mOwner = null;
3141            }
3142        }
3143
3144        public boolean isInUse() {
3145            return mOwner != null || mRestarting;
3146        }
3147
3148        void add(ServiceState other) {
3149            addDurations(other);
3150            mRunCount += other.mRunCount;
3151            mStartedCount += other.mStartedCount;
3152            mBoundCount += other.mBoundCount;
3153            mExecCount += other.mExecCount;
3154        }
3155
3156        void resetSafely(long now) {
3157            resetDurationsSafely();
3158            mRunCount = mRunState != STATE_NOTHING ? 1 : 0;
3159            mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0;
3160            mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0;
3161            mExecCount = mExecState != STATE_NOTHING ? 1 : 0;
3162            mRunStartTime = mStartedStartTime = mBoundStartTime = mExecStartTime = now;
3163        }
3164
3165        void writeToParcel(Parcel out, long now) {
3166            writeDurationsToParcel(out);
3167            out.writeInt(mRunCount);
3168            out.writeInt(mStartedCount);
3169            out.writeInt(mBoundCount);
3170            out.writeInt(mExecCount);
3171        }
3172
3173        boolean readFromParcel(Parcel in) {
3174            if (!readDurationsFromParcel(in)) {
3175                return false;
3176            }
3177            mRunCount = in.readInt();
3178            mStartedCount = in.readInt();
3179            mBoundCount = in.readInt();
3180            mExecCount = in.readInt();
3181            return true;
3182        }
3183
3184        void commitStateTime(long now) {
3185            if (mRunState != STATE_NOTHING) {
3186                addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT), now - mRunStartTime);
3187                mRunStartTime = now;
3188            }
3189            if (mStartedState != STATE_NOTHING) {
3190                addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT),
3191                        now - mStartedStartTime);
3192                mStartedStartTime = now;
3193            }
3194            if (mBoundState != STATE_NOTHING) {
3195                addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), now - mBoundStartTime);
3196                mBoundStartTime = now;
3197            }
3198            if (mExecState != STATE_NOTHING) {
3199                addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime);
3200                mExecStartTime = now;
3201            }
3202        }
3203
3204        private void updateRunning(int memFactor, long now) {
3205            final int state = (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING
3206                    || mExecState != STATE_NOTHING) ? memFactor : STATE_NOTHING;
3207            if (mRunState != state) {
3208                if (mRunState != STATE_NOTHING) {
3209                    addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT),
3210                            now - mRunStartTime);
3211                } else if (state != STATE_NOTHING) {
3212                    mRunCount++;
3213                }
3214                mRunState = state;
3215                mRunStartTime = now;
3216            }
3217        }
3218
3219        public void setStarted(boolean started, int memFactor, long now) {
3220            if (mOwner == null) {
3221                Slog.wtf(TAG, "Starting service " + this + " without owner");
3222            }
3223            mStarted = started;
3224            updateStartedState(memFactor, now);
3225        }
3226
3227        public void setRestarting(boolean restarting, int memFactor, long now) {
3228            mRestarting = restarting;
3229            updateStartedState(memFactor, now);
3230        }
3231
3232        void updateStartedState(int memFactor, long now) {
3233            final boolean wasStarted = mStartedState != STATE_NOTHING;
3234            final boolean started = mStarted || mRestarting;
3235            final int state = started ? memFactor : STATE_NOTHING;
3236            if (mStartedState != state) {
3237                if (mStartedState != STATE_NOTHING) {
3238                    addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT),
3239                            now - mStartedStartTime);
3240                } else if (started) {
3241                    mStartedCount++;
3242                }
3243                mStartedState = state;
3244                mStartedStartTime = now;
3245                mProc = mProc.pullFixedProc(mPackage);
3246                if (wasStarted != started) {
3247                    if (started) {
3248                        mProc.incStartedServices(memFactor, now, mName);
3249                    } else {
3250                        mProc.decStartedServices(memFactor, now, mName);
3251                    }
3252                }
3253                updateRunning(memFactor, now);
3254            }
3255        }
3256
3257        public void setBound(boolean bound, int memFactor, long now) {
3258            if (mOwner == null) {
3259                Slog.wtf(TAG, "Binding service " + this + " without owner");
3260            }
3261            final int state = bound ? memFactor : STATE_NOTHING;
3262            if (mBoundState != state) {
3263                if (mBoundState != STATE_NOTHING) {
3264                    addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT),
3265                            now - mBoundStartTime);
3266                } else if (bound) {
3267                    mBoundCount++;
3268                }
3269                mBoundState = state;
3270                mBoundStartTime = now;
3271                updateRunning(memFactor, now);
3272            }
3273        }
3274
3275        public void setExecuting(boolean executing, int memFactor, long now) {
3276            if (mOwner == null) {
3277                Slog.wtf(TAG, "Executing service " + this + " without owner");
3278            }
3279            final int state = executing ? memFactor : STATE_NOTHING;
3280            if (mExecState != state) {
3281                if (mExecState != STATE_NOTHING) {
3282                    addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime);
3283                } else if (executing) {
3284                    mExecCount++;
3285                }
3286                mExecState = state;
3287                mExecStartTime = now;
3288                updateRunning(memFactor, now);
3289            }
3290        }
3291
3292        private long getDuration(int opType, int curState, long startTime, int memFactor,
3293                long now) {
3294            int state = opType + (memFactor*SERVICE_COUNT);
3295            long time = getDuration(state, now);
3296            if (curState == memFactor) {
3297                time += now - startTime;
3298            }
3299            return time;
3300        }
3301
3302        public String toString() {
3303            return "ServiceState{" + Integer.toHexString(System.identityHashCode(this))
3304                    + " " + mName + " pkg=" + mPackage + " proc="
3305                    + Integer.toHexString(System.identityHashCode(this)) + "}";
3306        }
3307    }
3308
3309    public static final class PackageState {
3310        public final ArrayMap<String, ProcessState> mProcesses
3311                = new ArrayMap<String, ProcessState>();
3312        public final ArrayMap<String, ServiceState> mServices
3313                = new ArrayMap<String, ServiceState>();
3314        public final String mPackageName;
3315        public final int mUid;
3316
3317        public PackageState(String packageName, int uid) {
3318            mUid = uid;
3319            mPackageName = packageName;
3320        }
3321    }
3322
3323    public static final class ProcessDataCollection {
3324        final int[] screenStates;
3325        final int[] memStates;
3326        final int[] procStates;
3327
3328        public long totalTime;
3329        public long numPss;
3330        public long minPss;
3331        public long avgPss;
3332        public long maxPss;
3333        public long minUss;
3334        public long avgUss;
3335        public long maxUss;
3336
3337        public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) {
3338            screenStates = _screenStates;
3339            memStates = _memStates;
3340            procStates = _procStates;
3341        }
3342
3343        void print(PrintWriter pw, long overallTime, boolean full) {
3344            if (totalTime > overallTime) {
3345                pw.print("*");
3346            }
3347            printPercent(pw, (double) totalTime / (double) overallTime);
3348            if (numPss > 0) {
3349                pw.print(" (");
3350                printSizeValue(pw, minPss * 1024);
3351                pw.print("-");
3352                printSizeValue(pw, avgPss * 1024);
3353                pw.print("-");
3354                printSizeValue(pw, maxPss * 1024);
3355                pw.print("/");
3356                printSizeValue(pw, minUss * 1024);
3357                pw.print("-");
3358                printSizeValue(pw, avgUss * 1024);
3359                pw.print("-");
3360                printSizeValue(pw, maxUss * 1024);
3361                if (full) {
3362                    pw.print(" over ");
3363                    pw.print(numPss);
3364                }
3365                pw.print(")");
3366            }
3367        }
3368    }
3369}
3370