Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99fc939d authored by Mohamad Mahmoud's avatar Mohamad Mahmoud Committed by Automerger Merge Worker
Browse files

Merge "Resolve Thread Visibility Issue in...

Merge "Resolve Thread Visibility Issue in ProcessErrorStateRecord.appNotResponding" into udc-qpr-dev am: 52f45340 am: 7d41b689

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23766528



Change-Id: I82b7ddcc9d8914941f02757a54dda7d574c92be8
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 51bb7909 7d41b689
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -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;
@@ -458,6 +458,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
@@ -519,12 +524,16 @@ class ProcessErrorStateRecord {
            }
            mService.updateCpuStatsNow();
            mService.mAppProfiler.printCurrentCpuState(report, anrTime);
            synchronized (processCpuTracker) {
                info.append(processCpuTracker.printCurrentLoad());
            }
            info.append(report);
        }
        report.append(tracesFileException.getBuffer());

        synchronized (processCpuTracker) {
            info.append(processCpuTracker.printCurrentState(anrTime));
        }

        Slog.e(TAG, info.toString());
        if (tracesFile == null) {
+18 −15
Original line number Diff line number Diff line
@@ -464,14 +464,16 @@ public class StackTracesDumpHelper {
            latencyTracker.processCpuTrackerMethodsCalled();
        }
        ArrayList<Integer> extraPids = new ArrayList<>();
        synchronized (processCpuTracker) {
            processCpuTracker.init();
        }
        try {
            Thread.sleep(200);
        } catch (InterruptedException ignored) {
        }

        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++) {
@@ -488,6 +490,7 @@ public class StackTracesDumpHelper {
                            + stats.pid);
                }
            }
        }
        if (latencyTracker != null) {
            latencyTracker.processCpuTrackerMethodsReturned();
        }