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
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server;
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;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
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;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean localLOGV = DEBUG || Config.LOGV;
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,
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
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,
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM,
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 13: utime
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG                   // 14: stime
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final String[] mProcessFullStatsStringData = new String[3];
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final long[] mProcessFullStatsData = new long[3];
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] SYSTEM_CPU_FORMAT = new int[] {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_COMBINE,
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 1: user time
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 2: nice time
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 3: sys time
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 4: idle time
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 5: iowait time
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 6: irq time
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_LONG                   // 7: softirq time
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final long[] mSystemCpuData = new long[7];
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] LOAD_AVERAGE_FORMAT = new int[] {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_FLOAT,                 // 0: 1 min
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_FLOAT,                 // 1: 5 mins
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROC_SPACE_TERM|PROC_OUT_FLOAT                  // 2: 15 mins
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final float[] mLoadAverageData = new float[3];
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final boolean mIncludeThreads;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mLoad1 = 0;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mLoad5 = 0;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mLoad15 = 0;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mCurrentSampleTime;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mLastSampleTime;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseUserTime;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseSystemTime;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseIoWaitTime;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseIrqTime;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseSoftIrqTime;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mBaseIdleTime;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelUserTime;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelSystemTime;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelIoWaitTime;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelIrqTime;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelSoftIrqTime;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRelIdleTime;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mCurPids;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mCurThreadPids;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ArrayList<Stats> mProcStats = new ArrayList<Stats>();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final ArrayList<Stats> mWorkingProcs = new ArrayList<Stats>();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mWorkingProcsSorted;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mFirst = true;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private byte[] mBuffer = new byte[256];
142e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
143e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /**
144e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * The time in microseconds that the CPU has been running at each speed.
145e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     */
146e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private long[] mCpuSpeedTimes;
147e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
148e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /**
149e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * The relative time in microseconds that the CPU has been running at each speed.
150e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     */
151e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private long[] mRelCpuSpeedTimes;
152e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
153e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /**
154e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * The different speeds that the CPU can be running at.
155e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     */
156e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private long[] mCpuSpeeds;
157e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Stats {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int pid;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String statFile;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String cmdlineFile;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String threadsDir;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ArrayList<Stats> threadStats;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ArrayList<Stats> workingThreads;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String baseName;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String name;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nameWidth;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long base_utime;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long base_stime;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int rel_utime;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int rel_stime;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
175151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        public long base_minfaults;
176151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        public long base_majfaults;
177151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        public int rel_minfaults;
178151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        public int rel_majfaults;
179151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean active;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean added;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean removed;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Stats(int _pid, int parentPid, boolean includeThreads) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pid = _pid;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parentPid < 0) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final File procDir = new File("/proc", Integer.toString(pid));
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                statFile = new File(procDir, "stat").toString();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdlineFile = new File(procDir, "cmdline").toString();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                threadsDir = (new File(procDir, "task")).toString();
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (includeThreads) {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    threadStats = new ArrayList<Stats>();
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    workingThreads = new ArrayList<Stats>();
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    threadStats = null;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    workingThreads = null;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final File procDir = new File("/proc", Integer.toString(
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        parentPid));
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final File taskDir = new File(
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new File(procDir, "task"), Integer.toString(pid));
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                statFile = new File(taskDir, "stat").toString();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdlineFile = null;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                threadsDir = null;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                threadStats = null;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                workingThreads = null;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static Comparator<Stats> sLoadComparator = new Comparator<Stats>() {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        compare(Stats sta, Stats stb)
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int ta = sta.rel_utime + sta.rel_stime;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int tb = stb.rel_utime + stb.rel_stime;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ta != tb) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ta > tb ? -1 : 1;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sta.added != stb.added) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sta.added ? -1 : 1;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sta.removed != stb.removed) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sta.added ? -1 : 1;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ProcessStats(boolean includeThreads) {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIncludeThreads = includeThreads;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLoadChanged(float load1, float load5, float load15) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int onMeasureProcessName(String name) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void init() {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = true;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        update();
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void update() {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastSampleTime = mCurrentSampleTime;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrentSampleTime = SystemClock.uptimeMillis();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final float[] loadAverages = mLoadAverageData;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Process.readProcFile("/proc/loadavg", LOAD_AVERAGE_FORMAT,
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, null, loadAverages)) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float load1 = loadAverages[0];
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float load5 = loadAverages[1];
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float load15 = loadAverages[2];
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (load1 != mLoad1 || load5 != mLoad5 || load15 != mLoad15) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoad1 = load1;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoad5 = load5;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoad15 = load15;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onLoadChanged(load1, load5, load15);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurPids = collectStats("/proc", -1, mFirst, mCurPids,
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcStats, mWorkingProcs);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = false;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long[] sysCpu = mSystemCpuData;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT,
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, sysCpu, null)) {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Total user time is user + nice time.
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long usertime = sysCpu[0]+sysCpu[1];
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Total system time is simply system time.
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long systemtime = sysCpu[2];
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Total idle time is simply idle time.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long idletime = sysCpu[3];
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Total irq time is iowait + irq + softirq time.
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long iowaittime = sysCpu[4];
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long irqtime = sysCpu[5];
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long softirqtime = sysCpu[6];
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelUserTime = (int)(usertime - mBaseUserTime);
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelSystemTime = (int)(systemtime - mBaseSystemTime);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelIoWaitTime = (int)(iowaittime - mBaseIoWaitTime);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelIrqTime = (int)(irqtime - mBaseIrqTime);
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelSoftIrqTime = (int)(softirqtime - mBaseSoftIrqTime);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRelIdleTime = (int)(idletime - mBaseIdleTime);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (false) {
2928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i("Load", "Total U:" + sysCpu[0] + " N:" + sysCpu[1]
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " S:" + sysCpu[2] + " I:" + sysCpu[3]
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " W:" + sysCpu[4] + " Q:" + sysCpu[5]
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " O:" + sysCpu[6]);
2968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i("Load", "Rel U:" + mRelUserTime + " S:" + mRelSystemTime
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " I:" + mRelIdleTime + " Q:" + mRelIrqTime);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseUserTime = usertime;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseSystemTime = systemtime;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseIoWaitTime = iowaittime;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseIrqTime = irqtime;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseSoftIrqTime = softirqtime;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBaseIdleTime = idletime;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWorkingProcsSorted = false;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = false;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] collectStats(String statsFile, int parentPid, boolean first,
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int[] curPids, ArrayList<Stats> allProcs,
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<Stats> workingProcs) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        workingProcs.clear();
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] pids = Process.getPids(statsFile, curPids);
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int NP = (pids == null) ? 0 : pids.length;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int NS = allProcs.size();
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curStatsIndex = 0;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NP; i++) {
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid = pids[i];
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pid < 0) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NP = pid;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Stats st = curStatsIndex < NS ? allProcs.get(curStatsIndex) : null;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (st != null && st.pid == pid) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update an existing process...
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.added = false;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curStatsIndex++;
3348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (localLOGV) Slog.v(TAG, "Existing pid " + pid + ": " + st);
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long[] procStats = mProcessStatsData;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!Process.readProcFile(st.statFile.toString(),
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PROCESS_STATS_FORMAT, null, procStats, null)) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
342151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                final long minfaults = procStats[PROCESS_STAT_MINOR_FAULTS];
343151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                final long majfaults = procStats[PROCESS_STAT_MAJOR_FAULTS];
344151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                final long utime = procStats[PROCESS_STAT_UTIME];
345151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                final long stime = procStats[PROCESS_STAT_STIME];
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (utime == st.base_utime && stime == st.base_stime) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.rel_utime = 0;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.rel_stime = 0;
350151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    st.rel_minfaults = 0;
351151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    st.rel_majfaults = 0;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (st.active) {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        st.active = false;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!st.active) {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.active = true;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parentPid < 0) {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getName(st, st.cmdlineFile);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (st.threadStats != null) {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCurThreadPids = collectStats(st.threadsDir, pid, false,
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mCurThreadPids, st.threadStats,
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                st.workingThreads);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.rel_utime = (int)(utime - st.base_utime);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.rel_stime = (int)(stime - st.base_stime);
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.base_utime = utime;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.base_stime = stime;
375151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                st.rel_minfaults = (int)(minfaults - st.base_minfaults);
376151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                st.rel_majfaults = (int)(majfaults - st.base_majfaults);
377151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                st.base_minfaults = minfaults;
378151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                st.base_majfaults = majfaults;
3798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i("Load", "Stats changed " + name + " pid=" + st.pid
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //      + " name=" + st.name + " utime=" + utime
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //      + " stime=" + stime);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                workingProcs.add(st);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (st == null || st.pid > pid) {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We have a new process!
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st = new Stats(pid, parentPid, mIncludeThreads);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                allProcs.add(curStatsIndex, st);
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curStatsIndex++;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NS++;
3928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (localLOGV) Slog.v(TAG, "New pid " + pid + ": " + st);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final String[] procStatsString = mProcessFullStatsStringData;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long[] procStats = mProcessFullStatsData;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (Process.readProcFile(st.statFile.toString(),
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PROCESS_FULL_STATS_FORMAT, procStatsString,
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        procStats, null)) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.baseName = parentPid < 0
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ? procStatsString[0] : Integer.toString(pid);
401151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    st.base_utime = 0; //procStats[1];
402151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    st.base_stime = 0; //procStats[2];
403151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    st.base_minfaults = st.base_majfaults = 0;
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.baseName = "<unknown>";
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.base_utime = st.base_stime = 0;
407151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    st.base_minfaults = st.base_majfaults = 0;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parentPid < 0) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getName(st, st.cmdlineFile);
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.name = st.baseName;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    st.nameWidth = onMeasureProcessName(st.name);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (st.threadStats != null) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCurThreadPids = collectStats(st.threadsDir, pid, true,
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mCurThreadPids, st.threadStats,
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                st.workingThreads);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i("Load", "New process: " + st.pid + " " + st.name);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.rel_utime = 0;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.rel_stime = 0;
425151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                st.rel_minfaults = 0;
426151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                st.rel_majfaults = 0;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                st.added = true;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!first) {
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    workingProcs.add(st);
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This process has gone away!
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.rel_utime = 0;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.rel_stime = 0;
437151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            st.rel_minfaults = 0;
438151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            st.rel_majfaults = 0;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.removed = true;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            workingProcs.add(st);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            allProcs.remove(curStatsIndex);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NS--;
4438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(TAG, "Removed pid " + st.pid + ": " + st);
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Decrement the loop counter so that we process the current pid
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // again the next time through the loop.
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (curStatsIndex < NS) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This process has gone away!
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Stats st = allProcs.get(curStatsIndex);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.rel_utime = 0;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.rel_stime = 0;
455151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            st.rel_minfaults = 0;
456151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            st.rel_majfaults = 0;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.removed = true;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            workingProcs.add(st);
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            allProcs.remove(curStatsIndex);
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NS--;
4618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(TAG, "Removed pid " + st.pid + ": " + st);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pids;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
466eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
467eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani    public long getCpuTimeForPid(int pid) {
468eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        final String statFile = "/proc/" + pid + "/stat";
469eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        final long[] statsData = mSinglePidStatsData;
470eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT,
471eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                null, statsData, null)) {
472151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            long time = statsData[PROCESS_STAT_UTIME]
473151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    + statsData[PROCESS_STAT_STIME];
474eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            return time;
475eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        }
476eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        return 0;
477eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani    }
478eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
479e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /**
480e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * Returns the times spent at each CPU speed, since the last call to this method. If this
481e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * is the first time, it will return 1 for each value.
482e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     * @return relative times spent at different speed steps.
483e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani     */
484e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public long[] getLastCpuSpeedTimes() {
485e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (mCpuSpeedTimes == null) {
486e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            mCpuSpeedTimes = getCpuSpeedTimes(null);
487e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            mRelCpuSpeedTimes = new long[mCpuSpeedTimes.length];
488e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            for (int i = 0; i < mCpuSpeedTimes.length; i++) {
489e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mRelCpuSpeedTimes[i] = 1; // Initialize
490e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
491e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        } else {
492e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            getCpuSpeedTimes(mRelCpuSpeedTimes);
493e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            for (int i = 0; i < mCpuSpeedTimes.length; i++) {
494e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                long temp = mRelCpuSpeedTimes[i];
495e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mRelCpuSpeedTimes[i] -= mCpuSpeedTimes[i];
496e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mCpuSpeedTimes[i] = temp;
497e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
498e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
499e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return mRelCpuSpeedTimes;
500e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
501e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
502e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private long[] getCpuSpeedTimes(long[] out) {
503e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        long[] tempTimes = out;
504e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        long[] tempSpeeds = mCpuSpeeds;
505e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        final int MAX_SPEEDS = 20;
506e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (out == null) {
507e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            tempTimes = new long[MAX_SPEEDS]; // Hopefully no more than that
508e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            tempSpeeds = new long[MAX_SPEEDS];
509e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
510e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        int speed = 0;
511e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        String file = readFile("/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state", '\0');
5122eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick        // Note: file may be null on kernels without cpufreq (i.e. the emulator's)
5132eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick        if (file != null) {
5142eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick            StringTokenizer st = new StringTokenizer(file, "\n ");
5152eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick            while (st.hasMoreElements()) {
5162eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                String token = st.nextToken();
5172eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                try {
5182eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    long val = Long.parseLong(token);
5192eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    tempSpeeds[speed] = val;
5202eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    token = st.nextToken();
5212eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    val = Long.parseLong(token);
5222eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    tempTimes[speed] = val;
5232eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    speed++;
5242eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    if (speed == MAX_SPEEDS) break; // No more
5252eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    if (localLOGV && out == null) {
5268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.v(TAG, "First time : Speed/Time = " + tempSpeeds[speed - 1]
5272eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                              + "\t" + tempTimes[speed - 1]);
5282eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                    }
5292eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick                } catch (NumberFormatException nfe) {
5308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.i(TAG, "Unable to parse time_in_state");
531e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
532e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
533e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
534e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (out == null) {
535e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            out = new long[speed];
536e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            mCpuSpeeds = new long[speed];
537e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            System.arraycopy(tempSpeeds, 0, mCpuSpeeds, 0, speed);
538e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            System.arraycopy(tempTimes, 0, out, 0, speed);
539e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
540e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return out;
541e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
542e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastUserTime() {
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelUserTime;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastSystemTime() {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelSystemTime;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastIoWaitTime() {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelIoWaitTime;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastIrqTime() {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelIrqTime;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastSoftIrqTime() {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelSoftIrqTime;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int getLastIdleTime() {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRelIdleTime;
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public float getTotalCpuPercent() {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ((float)(mRelUserTime+mRelSystemTime+mRelIrqTime)*100)
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                / (mRelUserTime+mRelSystemTime+mRelIrqTime+mRelIdleTime);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public int countWorkingStats() {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWorkingProcsSorted) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Collections.sort(mWorkingProcs, sLoadComparator);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWorkingProcsSorted = true;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWorkingProcs.size();
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public Stats getWorkingStats(int index) {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWorkingProcs.get(index);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final public String printCurrentState() {
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWorkingProcsSorted) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Collections.sort(mWorkingProcs, sLoadComparator);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWorkingProcsSorted = true;
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringWriter sw = new StringWriter();
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PrintWriter pw = new PrintWriter(sw);
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("Load: ");
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(mLoad1);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(" / ");
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(mLoad5);
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(" / ");
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(mLoad15);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long now = SystemClock.uptimeMillis();
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("CPU usage from ");
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(now-mLastSampleTime);
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("ms to ");
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(now-mCurrentSampleTime);
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("ms ago:");
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
607151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime
608151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                + mRelIrqTime + mRelSoftIrqTime + mRelIdleTime;
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWorkingProcs.size();
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Stats st = mWorkingProcs.get(i);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printProcessCPU(pw, st.added ? " +" : (st.removed ? " -": "  "),
614151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    st.name, totalTime, st.rel_utime, st.rel_stime, 0, 0, 0,
615151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                    st.rel_minfaults, st.rel_majfaults);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!st.removed && st.workingThreads != null) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int M = st.workingThreads.size();
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int j=0; j<M; j++) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Stats tst = st.workingThreads.get(j);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    printProcessCPU(pw,
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tst.added ? "   +" : (tst.removed ? "   -": "    "),
622151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                            tst.name, totalTime, tst.rel_utime, tst.rel_stime,
623151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                            0, 0, 0, 0, 0);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
628151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        printProcessCPU(pw, "", "TOTAL", totalTime, mRelUserTime, mRelSystemTime,
629151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                mRelIoWaitTime, mRelIrqTime, mRelSoftIrqTime, 0, 0);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sw.toString();
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void printProcessCPU(PrintWriter pw, String prefix, String label, int totalTime,
635151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            int user, int system, int iowait, int irq, int softIrq, int minFaults, int majFaults) {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(prefix);
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(label);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(": ");
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (totalTime == 0) totalTime = 1;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(((user+system+iowait+irq+softIrq)*100)/totalTime);
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("% = ");
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print((user*100)/totalTime);
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("% user + ");
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print((system*100)/totalTime);
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print("% kernel");
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iowait > 0) {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(" + ");
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print((iowait*100)/totalTime);
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print("% iowait");
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (irq > 0) {
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(" + ");
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print((irq*100)/totalTime);
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print("% irq");
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (softIrq > 0) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(" + ");
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print((softIrq*100)/totalTime);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print("% softirq");
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
661151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        if (minFaults > 0 || majFaults > 0) {
662151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            pw.print(" / faults:");
663151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            if (minFaults > 0) {
664151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(" ");
665151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(minFaults);
666151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(" minor");
667151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            }
668151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            if (majFaults > 0) {
669151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(" ");
670151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(majFaults);
671151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn                pw.print(" major");
672151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn            }
673151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn        }
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println();
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String readFile(String file, char endChar) {
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileInputStream is = new FileInputStream(file);
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int len = is.read(mBuffer);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is.close();
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (len > 0) {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int i;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<len; i++) {
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mBuffer[i] == endChar) {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new String(mBuffer, 0, 0, i);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (java.io.FileNotFoundException e) {
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (java.io.IOException e) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void getName(Stats st, String cmdlineFile) {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String newName = st.baseName;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (st.baseName == null || st.baseName.equals("app_process")) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cmdName = readFile(cmdlineFile, '\0');
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cmdName != null && cmdName.length() > 1) {
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newName = cmdName;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int i = newName.lastIndexOf("/");
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i > 0 && i < newName.length()-1) {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    newName = newName.substring(i+1);
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (st.name == null || !newName.equals(st.name)) {
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.name = newName;
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            st.nameWidth = onMeasureProcessName(st.name);
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
717