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