19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1745ce864ef41ce90938cc34d42a8e1075f69e7a61Dianne Hackbornpackage com.android.internal.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.os.Process.*;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
228e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackbornimport android.os.StrictMode;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
248a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.StringWriter;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator;
33e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport java.util.StringTokenizer;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ProcessStats {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "ProcessStats";
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
3843a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato    private static final boolean localLOGV = DEBUG || false;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] PROCESS_STATS_FORMAT = new int[] {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
426b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        PROC_SPACE_TERM|PROC_PARENS,
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
50151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 9: minor faults
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
52151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 11: major faults
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 13: utime
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG                   // 14: stime
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn    static final int PROCESS_STAT_MINOR_FAULTS = 0;
59151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn    static final int PROCESS_STAT_MAJOR_FAULTS = 1;
60151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn    static final int PROCESS_STAT_UTIME = 2;
61151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn    static final int PROCESS_STAT_STIME = 3;
62151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn
63eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani    /** Stores user time and system time in 100ths of a second. */
64151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn    private final long[] mProcessStatsData = new long[4];
65eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani    /** Stores user time and system time in 100ths of a second. */
66151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn    private final long[] mSinglePidStatsData = new long[4];
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] PROCESS_FULL_STATS_FORMAT = new int[] {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_PARENS|PROC_OUT_STRING,    // 1: name
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
786b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 9: minor faults
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
806b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 11: major faults
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 13: utime
83287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 14: stime
84287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        PROC_SPACE_TERM,
85287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        PROC_SPACE_TERM,
86287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        PROC_SPACE_TERM,
87287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        PROC_SPACE_TERM,
88287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        PROC_SPACE_TERM,
89287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        PROC_SPACE_TERM,
90287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 21: vsize
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
936b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    static final int PROCESS_FULL_STAT_MINOR_FAULTS = 1;
946b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    static final int PROCESS_FULL_STAT_MAJOR_FAULTS = 2;
956b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    static final int PROCESS_FULL_STAT_UTIME = 3;
966b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    static final int PROCESS_FULL_STAT_STIME = 4;
97287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    static final int PROCESS_FULL_STAT_VSIZE = 5;
986b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
99287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    private final String[] mProcessFullStatsStringData = new String[6];
100287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    private final long[] mProcessFullStatsData = new long[6];
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] SYSTEM_CPU_FORMAT = new int[] {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_COMBINE,
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 1: user time
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 2: nice time
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 3: sys time
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 4: idle time
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 5: iowait time
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 6: irq time
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG                   // 7: softirq time
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final long[] mSystemCpuData = new long[7];
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] LOAD_AVERAGE_FORMAT = new int[] {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_FLOAT,                 // 0: 1 min
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_FLOAT,                 // 1: 5 mins
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_FLOAT                  // 2: 15 mins
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final float[] mLoadAverageData = new float[3];
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final boolean mIncludeThreads;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mLoad1 = 0;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mLoad5 = 0;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mLoad15 = 0;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mCurrentSampleTime;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mLastSampleTime;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1326b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    private long mCurrentSampleRealTime;
1336b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    private long mLastSampleRealTime;
1346b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseUserTime;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseSystemTime;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseIoWaitTime;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseIrqTime;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseSoftIrqTime;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseIdleTime;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelUserTime;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelSystemTime;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelIoWaitTime;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelIrqTime;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelSoftIrqTime;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelIdleTime;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mCurPids;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mCurThreadPids;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ArrayList<Stats> mProcStats = new ArrayList<Stats>();
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ArrayList<Stats> mWorkingProcs = new ArrayList<Stats>();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mWorkingProcsSorted;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mFirst = true;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
157ca894b396b93344ac255746e12730cb269d4d856Martin Wallgren    private byte[] mBuffer = new byte[4096];
158e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
159e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /**
160e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * The time in microseconds that the CPU has been running at each speed.
161e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     */
162e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private long[] mCpuSpeedTimes;
163e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
164e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /**
165e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * The relative time in microseconds that the CPU has been running at each speed.
166e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     */
167e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private long[] mRelCpuSpeedTimes;
168e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
169e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /**
170e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * The different speeds that the CPU can be running at.
171e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     */
172e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private long[] mCpuSpeeds;
173e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Stats {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int pid;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String statFile;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String cmdlineFile;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String threadsDir;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ArrayList<Stats> threadStats;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ArrayList<Stats> workingThreads;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
182287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public boolean interesting;
183287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String baseName;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String name;
18645ce864ef41ce90938cc34d42a8e1075f69e7a61Dianne Hackborn        public int nameWidth;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1886b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        public long base_uptime;
1896b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        public long rel_uptime;
1906b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long base_utime;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long base_stime;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int rel_utime;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int rel_stime;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
196151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        public long base_minfaults;
197151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        public long base_majfaults;
198151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        public int rel_minfaults;
199151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        public int rel_majfaults;
200151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean active;
2026b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        public boolean working;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean added;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean removed;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Stats(int _pid, int parentPid, boolean includeThreads) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pid = _pid;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parentPid < 0) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final File procDir = new File("/proc", Integer.toString(pid));
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                statFile = new File(procDir, "stat").toString();
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdlineFile = new File(procDir, "cmdline").toString();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                threadsDir = (new File(procDir, "task")).toString();
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (includeThreads) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    threadStats = new ArrayList<Stats>();
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    workingThreads = new ArrayList<Stats>();
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    threadStats = null;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    workingThreads = null;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final File procDir = new File("/proc", Integer.toString(
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        parentPid));
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final File taskDir = new File(
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new File(procDir, "task"), Integer.toString(pid));
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                statFile = new File(taskDir, "stat").toString();
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdlineFile = null;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                threadsDir = null;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                threadStats = null;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                workingThreads = null;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static Comparator<Stats> sLoadComparator = new Comparator<Stats>() {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int
2366b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        compare(Stats sta, Stats stb) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int ta = sta.rel_utime + sta.rel_stime;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int tb = stb.rel_utime + stb.rel_stime;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ta != tb) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ta > tb ? -1 : 1;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sta.added != stb.added) {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sta.added ? -1 : 1;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sta.removed != stb.removed) {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sta.added ? -1 : 1;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ProcessStats(boolean includeThreads) {
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIncludeThreads = includeThreads;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLoadChanged(float load1, float load5, float load15) {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int onMeasureProcessName(String name) {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void init() {
2656b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (DEBUG) Slog.v(TAG, "Init: " + this);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = true;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        update();
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void update() {
2716b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (DEBUG) Slog.v(TAG, "Update: " + this);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastSampleTime = mCurrentSampleTime;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrentSampleTime = SystemClock.uptimeMillis();
2746b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        mLastSampleRealTime = mCurrentSampleRealTime;
2756b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        mCurrentSampleRealTime = SystemClock.elapsedRealtime();
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long[] sysCpu = mSystemCpuData;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT,
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, sysCpu, null)) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Total user time is user + nice time.
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long usertime = sysCpu[0]+sysCpu[1];
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Total system time is simply system time.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long systemtime = sysCpu[2];
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Total idle time is simply idle time.
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long idletime = sysCpu[3];
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Total irq time is iowait + irq + softirq time.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long iowaittime = sysCpu[4];
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long irqtime = sysCpu[5];
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long softirqtime = sysCpu[6];
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelUserTime = (int)(usertime - mBaseUserTime);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelSystemTime = (int)(systemtime - mBaseSystemTime);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelIoWaitTime = (int)(iowaittime - mBaseIoWaitTime);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelIrqTime = (int)(irqtime - mBaseIrqTime);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelSoftIrqTime = (int)(softirqtime - mBaseSoftIrqTime);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelIdleTime = (int)(idletime - mBaseIdleTime);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2986b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            if (DEBUG) {
2998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i("Load", "Total U:" + sysCpu[0] + " N:" + sysCpu[1]
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " S:" + sysCpu[2] + " I:" + sysCpu[3]
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " W:" + sysCpu[4] + " Q:" + sysCpu[5]
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " O:" + sysCpu[6]);
3038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i("Load", "Rel U:" + mRelUserTime + " S:" + mRelSystemTime
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " I:" + mRelIdleTime + " Q:" + mRelIrqTime);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseUserTime = usertime;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseSystemTime = systemtime;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseIoWaitTime = iowaittime;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseIrqTime = irqtime;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseSoftIrqTime = softirqtime;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseIdleTime = idletime;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3156b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        mCurPids = collectStats("/proc", -1, mFirst, mCurPids, mProcStats);
3166b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
3176b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        final float[] loadAverages = mLoadAverageData;
3186b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (Process.readProcFile("/proc/loadavg", LOAD_AVERAGE_FORMAT,
3196b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                null, null, loadAverages)) {
3206b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            float load1 = loadAverages[0];
3216b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            float load5 = loadAverages[1];
3226b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            float load15 = loadAverages[2];
3236b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            if (load1 != mLoad1 || load5 != mLoad5 || load15 != mLoad15) {
3246b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                mLoad1 = load1;
3256b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                mLoad5 = load5;
3266b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                mLoad15 = load15;
3276b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                onLoadChanged(load1, load5, load15);
3286b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            }
3296b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        }
3306b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
3316b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (DEBUG) Slog.i(TAG, "*** TIME TO COLLECT STATS: "
3326b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                + (SystemClock.uptimeMillis()-mCurrentSampleTime));
3336b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWorkingProcsSorted = false;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = false;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] collectStats(String statsFile, int parentPid, boolean first,
3396b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            int[] curPids, ArrayList<Stats> allProcs) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] pids = Process.getPids(statsFile, curPids);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int NP = (pids == null) ? 0 : pids.length;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int NS = allProcs.size();
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curStatsIndex = 0;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NP; i++) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid = pids[i];
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pid < 0) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NP = pid;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Stats st = curStatsIndex < NS ? allProcs.get(curStatsIndex) : null;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (st != null && st.pid == pid) {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update an existing process...
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.added = false;
3566b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                st.working = false;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curStatsIndex++;
3586b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                if (DEBUG) Slog.v(TAG, "Existing "
3596b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        + (parentPid < 0 ? "process" : "thread")
3606b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        + " pid " + pid + ": " + st);
3616b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
362287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (st.interesting) {
363287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    final long uptime = SystemClock.uptimeMillis();
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
365287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    final long[] procStats = mProcessStatsData;
366287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    if (!Process.readProcFile(st.statFile.toString(),
367287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            PROCESS_STATS_FORMAT, null, procStats, null)) {
368287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        continue;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
371287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    final long minfaults = procStats[PROCESS_STAT_MINOR_FAULTS];
372287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    final long majfaults = procStats[PROCESS_STAT_MAJOR_FAULTS];
373287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    final long utime = procStats[PROCESS_STAT_UTIME];
374287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    final long stime = procStats[PROCESS_STAT_STIME];
375287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
376287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    if (utime == st.base_utime && stime == st.base_stime) {
377287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.rel_utime = 0;
378287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.rel_stime = 0;
379287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.rel_minfaults = 0;
380287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.rel_majfaults = 0;
381287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        if (st.active) {
382287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            st.active = false;
383287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        }
384287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        continue;
385287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
387287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    if (!st.active) {
388287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.active = true;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
390287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
391287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    if (parentPid < 0) {
392287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        getName(st, st.cmdlineFile);
393287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        if (st.threadStats != null) {
394287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            mCurThreadPids = collectStats(st.threadsDir, pid, false,
395287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                    mCurThreadPids, st.threadStats);
396287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        }
397287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    }
398287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
399287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    if (DEBUG) Slog.v("Load", "Stats changed " + st.name + " pid=" + st.pid
400287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            + " utime=" + utime + "-" + st.base_utime
401287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            + " stime=" + stime + "-" + st.base_stime
402287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            + " minfaults=" + minfaults + "-" + st.base_minfaults
403287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            + " majfaults=" + majfaults + "-" + st.base_majfaults);
404287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
405287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.rel_uptime = uptime - st.base_uptime;
406287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.base_uptime = uptime;
407287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.rel_utime = (int)(utime - st.base_utime);
408287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.rel_stime = (int)(stime - st.base_stime);
409287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.base_utime = utime;
410287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.base_stime = stime;
411287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.rel_minfaults = (int)(minfaults - st.base_minfaults);
412287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.rel_majfaults = (int)(majfaults - st.base_majfaults);
413287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.base_minfaults = minfaults;
414287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.base_majfaults = majfaults;
415287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    st.working = true;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (st == null || st.pid > pid) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We have a new process!
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st = new Stats(pid, parentPid, mIncludeThreads);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                allProcs.add(curStatsIndex, st);
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curStatsIndex++;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NS++;
4276b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                if (DEBUG) Slog.v(TAG, "New "
4286b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        + (parentPid < 0 ? "process" : "thread")
4296b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        + " pid " + pid + ": " + st);
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final String[] procStatsString = mProcessFullStatsStringData;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long[] procStats = mProcessFullStatsData;
4336b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                st.base_uptime = SystemClock.uptimeMillis();
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (Process.readProcFile(st.statFile.toString(),
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PROCESS_FULL_STATS_FORMAT, procStatsString,
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        procStats, null)) {
437287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    // This is a possible way to filter out processes that
438287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    // are actually kernel threads...  do we want to?  Some
439287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    // of them do use CPU, but there can be a *lot* that are
440287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    // not doing anything.
441287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    if (true || procStats[PROCESS_FULL_STAT_VSIZE] != 0) {
442287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.interesting = true;
443287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.baseName = procStatsString[0];
444287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.base_minfaults = procStats[PROCESS_FULL_STAT_MINOR_FAULTS];
445287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.base_majfaults = procStats[PROCESS_FULL_STAT_MAJOR_FAULTS];
446287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.base_utime = procStats[PROCESS_FULL_STAT_UTIME];
447287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.base_stime = procStats[PROCESS_FULL_STAT_STIME];
448287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    } else {
449287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        Slog.i(TAG, "Skipping kernel process pid " + pid
450287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                + " name " + procStatsString[0]);
451287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        st.baseName = procStatsString[0];
452287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
454287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    Slog.w(TAG, "Skipping unknown process pid " + pid);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.baseName = "<unknown>";
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.base_utime = st.base_stime = 0;
457151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    st.base_minfaults = st.base_majfaults = 0;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parentPid < 0) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getName(st, st.cmdlineFile);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (st.threadStats != null) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCurThreadPids = collectStats(st.threadsDir, pid, true,
4646b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                                mCurThreadPids, st.threadStats);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
466287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                } else if (st.interesting) {
4676b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    st.name = st.baseName;
4686b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    st.nameWidth = onMeasureProcessName(st.name);
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4706b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
4716b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                if (DEBUG) Slog.v("Load", "Stats added " + st.name + " pid=" + st.pid
4726b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        + " utime=" + st.base_utime + " stime=" + st.base_stime
4736b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        + " minfaults=" + st.base_minfaults + " majfaults=" + st.base_majfaults);
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.rel_utime = 0;
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.rel_stime = 0;
477151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                st.rel_minfaults = 0;
478151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                st.rel_majfaults = 0;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.added = true;
480287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (!first && st.interesting) {
4816b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    st.working = true;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This process has gone away!
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.rel_utime = 0;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.rel_stime = 0;
489151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            st.rel_minfaults = 0;
490151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            st.rel_majfaults = 0;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.removed = true;
4926b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            st.working = true;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            allProcs.remove(curStatsIndex);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NS--;
4956b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            if (DEBUG) Slog.v(TAG, "Removed "
4966b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    + (parentPid < 0 ? "process" : "thread")
4976b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    + " pid " + pid + ": " + st);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Decrement the loop counter so that we process the current pid
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // again the next time through the loop.
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (curStatsIndex < NS) {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This process has gone away!
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Stats st = allProcs.get(curStatsIndex);
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.rel_utime = 0;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.rel_stime = 0;
509151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            st.rel_minfaults = 0;
510151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            st.rel_majfaults = 0;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.removed = true;
5126b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            st.working = true;
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            allProcs.remove(curStatsIndex);
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NS--;
5158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(TAG, "Removed pid " + st.pid + ": " + st);
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pids;
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
520eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
521eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani    public long getCpuTimeForPid(int pid) {
522eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        final String statFile = "/proc/" + pid + "/stat";
523eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        final long[] statsData = mSinglePidStatsData;
524eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT,
525eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                null, statsData, null)) {
526151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            long time = statsData[PROCESS_STAT_UTIME]
527151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    + statsData[PROCESS_STAT_STIME];
528eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            return time;
529eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        }
530eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        return 0;
531eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani    }
532eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
533e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /**
534e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * Returns the times spent at each CPU speed, since the last call to this method. If this
535e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * is the first time, it will return 1 for each value.
536e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * @return relative times spent at different speed steps.
537e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     */
538e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public long[] getLastCpuSpeedTimes() {
539e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (mCpuSpeedTimes == null) {
540e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            mCpuSpeedTimes = getCpuSpeedTimes(null);
541e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            mRelCpuSpeedTimes = new long[mCpuSpeedTimes.length];
542e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            for (int i = 0; i < mCpuSpeedTimes.length; i++) {
543e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mRelCpuSpeedTimes[i] = 1; // Initialize
544e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
545e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        } else {
546e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            getCpuSpeedTimes(mRelCpuSpeedTimes);
547e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            for (int i = 0; i < mCpuSpeedTimes.length; i++) {
548e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                long temp = mRelCpuSpeedTimes[i];
549e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mRelCpuSpeedTimes[i] -= mCpuSpeedTimes[i];
550e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mCpuSpeedTimes[i] = temp;
551e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
552e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
553e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return mRelCpuSpeedTimes;
554e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
555e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
556e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private long[] getCpuSpeedTimes(long[] out) {
557e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        long[] tempTimes = out;
558e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        long[] tempSpeeds = mCpuSpeeds;
559ca894b396b93344ac255746e12730cb269d4d856Martin Wallgren        final int MAX_SPEEDS = 60;
560e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (out == null) {
561e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            tempTimes = new long[MAX_SPEEDS]; // Hopefully no more than that
562e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            tempSpeeds = new long[MAX_SPEEDS];
563e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
564e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        int speed = 0;
565e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        String file = readFile("/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state", '\0');
5662eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick        // Note: file may be null on kernels without cpufreq (i.e. the emulator's)
5672eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick        if (file != null) {
5682eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick            StringTokenizer st = new StringTokenizer(file, "\n ");
5692eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick            while (st.hasMoreElements()) {
5702eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                String token = st.nextToken();
5712eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                try {
5722eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    long val = Long.parseLong(token);
5732eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    tempSpeeds[speed] = val;
5742eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    token = st.nextToken();
5752eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    val = Long.parseLong(token);
5762eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    tempTimes[speed] = val;
5772eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    speed++;
5782eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    if (speed == MAX_SPEEDS) break; // No more
5792eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    if (localLOGV && out == null) {
5808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.v(TAG, "First time : Speed/Time = " + tempSpeeds[speed - 1]
5812eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                              + "\t" + tempTimes[speed - 1]);
5822eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    }
5832eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                } catch (NumberFormatException nfe) {
5848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.i(TAG, "Unable to parse time_in_state");
585e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
586e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
587e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
588e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (out == null) {
589e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            out = new long[speed];
590e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            mCpuSpeeds = new long[speed];
591e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            System.arraycopy(tempSpeeds, 0, mCpuSpeeds, 0, speed);
592e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            System.arraycopy(tempTimes, 0, out, 0, speed);
593e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
594e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return out;
595e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
596e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastUserTime() {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelUserTime;
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastSystemTime() {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelSystemTime;
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastIoWaitTime() {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelIoWaitTime;
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastIrqTime() {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelIrqTime;
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastSoftIrqTime() {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelSoftIrqTime;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastIdleTime() {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelIdleTime;
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public float getTotalCpuPercent() {
622cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn        int denom = mRelUserTime+mRelSystemTime+mRelIrqTime+mRelIdleTime;
623cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn        if (denom <= 0) {
624cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn            return 0;
625cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn        }
626cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn        return ((float)(mRelUserTime+mRelSystemTime+mRelIrqTime)*100) / denom;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6296b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    final void buildWorkingProcs() {
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWorkingProcsSorted) {
6316b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            mWorkingProcs.clear();
6326b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            final int N = mProcStats.size();
6336b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            for (int i=0; i<N; i++) {
6346b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                Stats stats = mProcStats.get(i);
6356b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                if (stats.working) {
6366b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    mWorkingProcs.add(stats);
6376b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    if (stats.threadStats != null && stats.threadStats.size() > 1) {
6386b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        stats.workingThreads.clear();
6396b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        final int M = stats.threadStats.size();
6406b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        for (int j=0; j<M; j++) {
6416b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                            Stats tstats = stats.threadStats.get(j);
6426b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                            if (tstats.working) {
6436b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                                stats.workingThreads.add(tstats);
6446b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                            }
6456b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        }
6466b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                        Collections.sort(stats.workingThreads, sLoadComparator);
6476b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    }
6486b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                }
6496b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Collections.sort(mWorkingProcs, sLoadComparator);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWorkingProcsSorted = true;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6536b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    }
6546b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
655287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    final public int countStats() {
656287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        return mProcStats.size();
657287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    }
658287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
659287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    final public Stats getStats(int index) {
660287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        return mProcStats.get(index);
661287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    }
662287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
6636b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    final public int countWorkingStats() {
6646b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        buildWorkingProcs();
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWorkingProcs.size();
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public Stats getWorkingStats(int index) {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWorkingProcs.get(index);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6726b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    final public String printCurrentLoad() {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringWriter sw = new StringWriter();
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PrintWriter pw = new PrintWriter(sw);
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("Load: ");
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(mLoad1);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(" / ");
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(mLoad5);
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(" / ");
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(mLoad15);
6816b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        return sw.toString();
6826b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    }
6836b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
6846b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    final public String printCurrentState(long now) {
6856b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        buildWorkingProcs();
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6876b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        StringWriter sw = new StringWriter();
6886b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        PrintWriter pw = new PrintWriter(sw);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("CPU usage from ");
6916b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (now > mLastSampleTime) {
6926b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print(now-mLastSampleTime);
6936b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print("ms to ");
6946b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print(now-mCurrentSampleTime);
6956b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print("ms ago");
6966b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        } else {
6976b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print(mLastSampleTime-now);
6986b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print("ms to ");
6996b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print(mCurrentSampleTime-now);
7006b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print("ms later");
7016b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        }
7026b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
7036b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        long sampleTime = mCurrentSampleTime - mLastSampleTime;
7046b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        long sampleRealTime = mCurrentSampleRealTime - mLastSampleRealTime;
705cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn        long percAwake = sampleRealTime > 0 ? ((sampleTime*100) / sampleRealTime) : 0;
7066b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (percAwake != 100) {
7076b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print(" with ");
7086b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print(percAwake);
7096b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print("% awake");
7106b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        }
7116b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        pw.println(":");
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
713151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime
714151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                + mRelIrqTime + mRelSoftIrqTime + mRelIdleTime;
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7166b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (DEBUG) Slog.i(TAG, "totalTime " + totalTime + " over sample time "
7176b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                + (mCurrentSampleTime-mLastSampleTime));
7186b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWorkingProcs.size();
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Stats st = mWorkingProcs.get(i);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printProcessCPU(pw, st.added ? " +" : (st.removed ? " -": "  "),
7236b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    st.pid, st.name, (int)(st.rel_uptime+5)/10,
7246b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                    st.rel_utime, st.rel_stime, 0, 0, 0, st.rel_minfaults, st.rel_majfaults);
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!st.removed && st.workingThreads != null) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int M = st.workingThreads.size();
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int j=0; j<M; j++) {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Stats tst = st.workingThreads.get(j);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    printProcessCPU(pw,
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tst.added ? "   +" : (tst.removed ? "   -": "    "),
7316b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                            tst.pid, tst.name, (int)(st.rel_uptime+5)/10,
7326b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                            tst.rel_utime, tst.rel_stime, 0, 0, 0, 0, 0);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7376b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        printProcessCPU(pw, "", -1, "TOTAL", totalTime, mRelUserTime, mRelSystemTime,
738151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                mRelIoWaitTime, mRelIrqTime, mRelSoftIrqTime, 0, 0);
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sw.toString();
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7436b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    private void printRatio(PrintWriter pw, long numerator, long denominator) {
7446b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        long thousands = (numerator*1000)/denominator;
7456b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        long hundreds = thousands/10;
7466b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        pw.print(hundreds);
7476b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (hundreds < 10) {
7486b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            long remainder = thousands - (hundreds*10);
7496b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            if (remainder != 0) {
7506b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                pw.print('.');
7516b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                pw.print(remainder);
7526b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            }
7536b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        }
7546b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    }
7556b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn
7566b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn    private void printProcessCPU(PrintWriter pw, String prefix, int pid, String label,
7576b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            int totalTime, int user, int system, int iowait, int irq, int softIrq,
7586b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            int minFaults, int majFaults) {
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(prefix);
7606b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (totalTime == 0) totalTime = 1;
7616b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        printRatio(pw, user+system+iowait+irq+softIrq, totalTime);
7626b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        pw.print("% ");
7636b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        if (pid >= 0) {
7646b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print(pid);
7656b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            pw.print("/");
7666b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        }
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(label);
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(": ");
7696b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        printRatio(pw, user, totalTime);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("% user + ");
7716b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        printRatio(pw, system, totalTime);
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("% kernel");
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iowait > 0) {
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(" + ");
7756b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            printRatio(pw, iowait, totalTime);
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print("% iowait");
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (irq > 0) {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(" + ");
7806b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            printRatio(pw, irq, totalTime);
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print("% irq");
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (softIrq > 0) {
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(" + ");
7856b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            printRatio(pw, softIrq, totalTime);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print("% softirq");
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
788151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        if (minFaults > 0 || majFaults > 0) {
789151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            pw.print(" / faults:");
790151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            if (minFaults > 0) {
791151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(" ");
792151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(minFaults);
793151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(" minor");
794151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            }
795151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            if (majFaults > 0) {
796151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(" ");
797151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(majFaults);
798151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(" major");
799151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            }
800151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        }
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println();
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String readFile(String file, char endChar) {
8058e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn        // Permit disk reads here, as /proc/meminfo isn't really "on
8068e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn        // disk" and should be fast.  TODO: make BlockGuard ignore
8078e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn        // /proc/ and /sys/ files perhaps?
8088e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn        StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
8096689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick        FileInputStream is = null;
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8116689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick            is = new FileInputStream(file);
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int len = is.read(mBuffer);
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is.close();
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (len > 0) {
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int i;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<len; i++) {
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mBuffer[i] == endChar) {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8224136c98ecc25861da5462d1364f1c4bfd7bd5c31Christian Mehlmauer                return new String(mBuffer, 0, i);
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (java.io.FileNotFoundException e) {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (java.io.IOException e) {
8266689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick        } finally {
8276689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick            if (is != null) {
8286689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick                try {
8296689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick                    is.close();
8306689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick                } catch (java.io.IOException e) {
8316689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick                }
8326689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick            }
8338e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            StrictMode.setThreadPolicy(savedPolicy);
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void getName(Stats st, String cmdlineFile) {
8396b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn        String newName = st.name;
840287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        if (st.name == null || st.name.equals("app_process")
841287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                || st.name.equals("<pre-initialized>")) {
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cmdName = readFile(cmdlineFile, '\0');
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cmdName != null && cmdName.length() > 1) {
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newName = cmdName;
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int i = newName.lastIndexOf("/");
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i > 0 && i < newName.length()-1) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    newName = newName.substring(i+1);
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8506b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            if (newName == null) {
8516b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn                newName = st.baseName;
8526b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn            }
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (st.name == null || !newName.equals(st.name)) {
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.name = newName;
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.nameWidth = onMeasureProcessName(st.name);
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
860