diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ProcessErrorStateRecord.java | 15 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/StackTracesDumpHelper.java | 33 |
2 files changed, 30 insertions, 18 deletions
diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java index e4983846f1da..753fdaed2fe6 100644 --- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java @@ -51,11 +51,11 @@ import android.util.SparseBooleanArray; import com.android.internal.annotations.CompositeRWLock; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.modules.expresslog.Counter; import com.android.internal.os.ProcessCpuTracker; import com.android.internal.os.TimeoutRecord; import com.android.internal.os.anr.AnrLatencyTracker; import com.android.internal.util.FrameworkStatsLog; +import com.android.modules.expresslog.Counter; import com.android.server.ResourcePressureUtil; import com.android.server.criticalevents.CriticalEventLog; import com.android.server.stats.pull.ProcfsMemoryUtil.MemorySnapshot; @@ -456,6 +456,11 @@ class ProcessErrorStateRecord { String currentPsiState = ResourcePressureUtil.currentPsiState(); latencyTracker.currentPsiStateReturned(); report.append(currentPsiState); + // The 'processCpuTracker' variable is a shared resource that might be initialized and + // updated in a different thread. In order to prevent thread visibility issues, which + // can occur when one thread does not immediately see the changes made to + // 'processCpuTracker' by another thread, it is necessary to use synchronization whenever + // 'processCpuTracker' is accessed or modified. ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true); // We push the native pids collection task to the helper thread through @@ -517,12 +522,16 @@ class ProcessErrorStateRecord { } mService.updateCpuStatsNow(); mService.mAppProfiler.printCurrentCpuState(report, anrTime); - info.append(processCpuTracker.printCurrentLoad()); + synchronized (processCpuTracker) { + info.append(processCpuTracker.printCurrentLoad()); + } info.append(report); } report.append(tracesFileException.getBuffer()); - info.append(processCpuTracker.printCurrentState(anrTime)); + synchronized (processCpuTracker) { + info.append(processCpuTracker.printCurrentState(anrTime)); + } Slog.e(TAG, info.toString()); if (tracesFile == null) { diff --git a/services/core/java/com/android/server/am/StackTracesDumpHelper.java b/services/core/java/com/android/server/am/StackTracesDumpHelper.java index cf69b535151c..ba0fd17a3f2f 100644 --- a/services/core/java/com/android/server/am/StackTracesDumpHelper.java +++ b/services/core/java/com/android/server/am/StackTracesDumpHelper.java @@ -464,28 +464,31 @@ public class StackTracesDumpHelper { latencyTracker.processCpuTrackerMethodsCalled(); } ArrayList<Integer> extraPids = new ArrayList<>(); - processCpuTracker.init(); + synchronized (processCpuTracker) { + processCpuTracker.init(); + } try { Thread.sleep(200); } catch (InterruptedException ignored) { } - processCpuTracker.update(); + synchronized (processCpuTracker) { + processCpuTracker.update(); + // We'll take the stack crawls of just the top apps using CPU. + final int workingStatsNumber = processCpuTracker.countWorkingStats(); + for (int i = 0; i < workingStatsNumber && extraPids.size() < 2; i++) { + ProcessCpuTracker.Stats stats = processCpuTracker.getWorkingStats(i); + if (lastPids.indexOfKey(stats.pid) >= 0) { + if (DEBUG_ANR) { + Slog.d(TAG, "Collecting stacks for extra pid " + stats.pid); + } - // We'll take the stack crawls of just the top apps using CPU. - final int workingStatsNumber = processCpuTracker.countWorkingStats(); - for (int i = 0; i < workingStatsNumber && extraPids.size() < 2; i++) { - ProcessCpuTracker.Stats stats = processCpuTracker.getWorkingStats(i); - if (lastPids.indexOfKey(stats.pid) >= 0) { - if (DEBUG_ANR) { - Slog.d(TAG, "Collecting stacks for extra pid " + stats.pid); + extraPids.add(stats.pid); + } else { + Slog.i(TAG, + "Skipping next CPU consuming process, not a java proc: " + + stats.pid); } - - extraPids.add(stats.pid); - } else { - Slog.i(TAG, - "Skipping next CPU consuming process, not a java proc: " - + stats.pid); } } if (latencyTracker != null) { |