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

Commit b0424de7 authored by Zim's avatar Zim Committed by Zimuzo Ezeozue
Browse files

Retrieve max ANR dialog before dumping thread stacks

Dumping thread stacks can take >5s, after which the cause of the ANR
might have completed and there might not longer be a valid ANR
controller to cancel the dialog.

Test: Manual
Bug: 170486601

Fix comment from Idb9190a0e6014ce64bf1412c26f6ae03f97e922d

Test: m
Bug: 170486601
Change-Id: Ibb5699693fac054fd8a8237af7036e610d7af189
parent 6f1e0ddd
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -329,6 +329,22 @@ class ProcessErrorStateRecord {
            info.append("Package is ").append((int) (loadingProgress * 100)).append("% loaded.\n");
        }

        // Retrieve controller with max ANR delay from AnrControllers
        // Note that we retrieve the controller before dumping stacks because dumping stacks can
        // take a few seconds, after which the cause of the ANR delay might have completed and
        // there might no longer be a valid ANR controller to cancel the dialog in that case
        AnrController anrController = mService.mActivityTaskManager.getAnrController(aInfo);
        long anrDialogDelayMs = 0;
        if (anrController != null) {
            String packageName = aInfo.packageName;
            int uid = aInfo.uid;
            anrDialogDelayMs = anrController.getAnrDelayMillis(packageName, uid);
            // Might execute an async binder call to a system app to show an interim
            // ANR progress UI
            anrController.onAnrDelayStarted(packageName, uid);
            Slog.i(TAG, "ANR delay of " + anrDialogDelayMs + "ms started for " + packageName);
        }

        StringBuilder report = new StringBuilder();
        report.append(MemoryPressureUtil.currentPsiState());
        ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true);
@@ -417,20 +433,6 @@ class ProcessErrorStateRecord {
            return;
        }

        // Retrieve max ANR delay from AnrControllers without the mService lock since the
        // controllers might in turn call into apps
        AnrController anrController = mService.mActivityTaskManager.getAnrController(aInfo);
        long anrDialogDelayMs = 0;
        if (anrController != null) {
            String packageName = aInfo.packageName;
            int uid = aInfo.uid;
            anrDialogDelayMs = anrController.getAnrDelayMillis(packageName, uid);
            // Might execute an async binder call to a system app to show an interim
            // ANR progress UI
            anrController.onAnrDelayStarted(packageName, uid);
            Slog.i(TAG, "ANR delay of " + anrDialogDelayMs + "ms started for " + packageName);
        }

        synchronized (mService) {
            // mBatteryStatsService can be null if the AMS is constructed with injector only. This
            // will only happen in tests.