summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ProcessErrorStateRecord.java15
-rw-r--r--services/core/java/com/android/server/am/StackTracesDumpHelper.java33
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) {