diff options
| author | 2016-08-30 16:39:03 -0700 | |
|---|---|---|
| committer | 2016-08-30 16:39:03 -0700 | |
| commit | 10e8f16add72b5384a21c947eebff14d34a66924 (patch) | |
| tree | fa593b56ae31f842784804df9505143994544b44 | |
| parent | b334c33d65894f5ca9833fa55c3a1cf75e01c497 (diff) | |
Call Debug.getPss without a lock held
Attempt to reduce the chances of watchdog killing the system
server if process pss gathering takes too long during heavy load.
Bug: 30896716
Change-Id: I4ed1a15c0c512a8c82842cde74e733d99d887ee0
| -rw-r--r-- | core/java/com/android/internal/os/ProcessCpuTracker.java | 18 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 54 |
2 files changed, 46 insertions, 26 deletions
diff --git a/core/java/com/android/internal/os/ProcessCpuTracker.java b/core/java/com/android/internal/os/ProcessCpuTracker.java index b7e571871086..e46dfc4e0cb6 100644 --- a/core/java/com/android/internal/os/ProcessCpuTracker.java +++ b/core/java/com/android/internal/os/ProcessCpuTracker.java @@ -39,6 +39,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; +import java.util.List; import java.util.StringTokenizer; public class ProcessCpuTracker { @@ -177,6 +178,11 @@ public class ProcessCpuTracker { private byte[] mBuffer = new byte[4096]; + public interface FilterStats { + /** Which stats to pick when filtering */ + boolean needed(Stats stats); + } + public static class Stats { public final int pid; public final int uid; @@ -695,6 +701,18 @@ public class ProcessCpuTracker { return mProcStats.get(index); } + final public List<Stats> getStats(FilterStats filter) { + final ArrayList<Stats> statses = new ArrayList<>(mProcStats.size()); + final int N = mProcStats.size(); + for (int p = 0; p < N; p++) { + Stats stats = mProcStats.get(p); + if (filter.needed(stats)) { + statses.add(stats); + } + } + return statses; + } + final public int countWorkingStats() { buildWorkingProcs(); return mWorkingProcs.size(); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index aedf089c8c1a..1dfca2b156da 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2378,22 +2378,21 @@ public final class ActivityManagerService extends ActivityManagerNative if (memInfo != null) { updateCpuStatsNow(); long nativeTotalPss = 0; + final List<ProcessCpuTracker.Stats> stats; synchronized (mProcessCpuTracker) { - final int N = mProcessCpuTracker.countStats(); - for (int j=0; j<N; j++) { - ProcessCpuTracker.Stats st = mProcessCpuTracker.getStats(j); - if (st.vsize <= 0 || st.uid >= Process.FIRST_APPLICATION_UID) { - // This is definitely an application process; skip it. + stats = mProcessCpuTracker.getStats( (st)-> { + return st.vsize > 0 && st.uid < Process.FIRST_APPLICATION_UID; + }); + } + final int N = stats.size(); + for (int j = 0; j < N; j++) { + synchronized (mPidsSelfLocked) { + if (mPidsSelfLocked.indexOfKey(stats.get(j).pid) >= 0) { + // This is one of our own processes; skip it. continue; } - synchronized (mPidsSelfLocked) { - if (mPidsSelfLocked.indexOfKey(st.pid) >= 0) { - // This is one of our own processes; skip it. - continue; - } - } - nativeTotalPss += Debug.getPss(st.pid, null, null); } + nativeTotalPss += Debug.getPss(stats.get(j).pid, null, null); } memInfo.readMemInfo(); synchronized (ActivityManagerService.this) { @@ -16510,21 +16509,24 @@ public final class ActivityManagerService extends ActivityManagerNative } updateCpuStatsNow(); long[] memtrackTmp = new long[1]; + final List<ProcessCpuTracker.Stats> stats; + // Get a list of Stats that have vsize > 0 synchronized (mProcessCpuTracker) { - final int N = mProcessCpuTracker.countStats(); - for (int i=0; i<N; i++) { - ProcessCpuTracker.Stats st = mProcessCpuTracker.getStats(i); - if (st.vsize > 0) { - long pss = Debug.getPss(st.pid, null, memtrackTmp); - if (pss > 0) { - if (infoMap.indexOfKey(st.pid) < 0) { - ProcessMemInfo mi = new ProcessMemInfo(st.name, st.pid, - ProcessList.NATIVE_ADJ, -1, "native", null); - mi.pss = pss; - mi.memtrack = memtrackTmp[0]; - memInfos.add(mi); - } - } + stats = mProcessCpuTracker.getStats((st) -> { + return st.vsize > 0; + }); + } + final int statsCount = stats.size(); + for (int i = 0; i < statsCount; i++) { + ProcessCpuTracker.Stats st = stats.get(i); + long pss = Debug.getPss(st.pid, null, memtrackTmp); + if (pss > 0) { + if (infoMap.indexOfKey(st.pid) < 0) { + ProcessMemInfo mi = new ProcessMemInfo(st.name, st.pid, + ProcessList.NATIVE_ADJ, -1, "native", null); + mi.pss = pss; + mi.memtrack = memtrackTmp[0]; + memInfos.add(mi); } } } |