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

Commit fdea154f authored by Jeremy Meyer's avatar Jeremy Meyer
Browse files

Dump resources without holding the ActivityManagerService's lock

Fixes: 217654334
Test: Manual, take a bug report and verify it looks the same
Change-Id: I5d7c3972adbe186babc86b0dc537869f0f65d338
parent f6c6d6bc
Loading
Loading
Loading
Loading
+35 −23
Original line number Diff line number Diff line
@@ -257,7 +257,6 @@ import android.os.BinderProxy;
import android.os.BugreportParams;
import android.os.Build;
import android.os.Bundle;
import android.os.ConditionVariable;
import android.os.Debug;
import android.os.DropBoxManager;
import android.os.FactoryTest;
@@ -15523,20 +15522,37 @@ public class ActivityManagerService extends IActivityManager.Stub
     * @throws RemoteException
     */
    public void dumpAllResources(ParcelFileDescriptor fd, PrintWriter pw) throws RemoteException {
        synchronized (mProcLock) {
            mProcessList.forEachLruProcessesLOSP(true, app -> {
                ConditionVariable lock = new ConditionVariable();
                RemoteCallback
                        finishCallback = new RemoteCallback(result -> lock.open(), null);
        final ArrayList<ProcessRecord> processes = new ArrayList<>();
        synchronized (mPidsSelfLocked) {
            processes.addAll(mProcessList.getLruProcessesLOSP());
        }
        for (int i = 0, size = processes.size(); i < size; i++) {
            ProcessRecord app = processes.get(i);
            pw.println(String.format("------ DUMP RESOURCES %s (%s)  ------",
                    app.processName,
                    app.info.packageName));
            pw.flush();
            try {
                    app.getThread().dumpResources(fd.dup(), finishCallback);
                    lock.block(2000);
                } catch (Exception e) {
                TransferPipe tp = new TransferPipe();
                try {
                    IApplicationThread thread = app.getThread();
                    if (thread != null) {
                        app.getThread().dumpResources(tp.getWriteFd(), null);
                        tp.go(fd.getFileDescriptor(), 2000);
                        pw.println(String.format("------ END DUMP RESOURCES %s (%s)  ------",
                                app.processName,
                                app.info.packageName));
                        pw.flush();
                    } else {
                        pw.println(String.format(
                                "------ DUMP RESOURCES %s (%s) failed, no thread ------",
                                app.processName,
                                app.info.packageName));
                    }
                } finally {
                    tp.kill();
                }
            } catch (IOException e) {
                pw.println(String.format(
                        "------ EXCEPTION DUMPING RESOURCES for %s (%s): %s ------",
                        app.processName,
@@ -15544,11 +15560,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                        e.getMessage()));
                pw.flush();
            }
                pw.println(String.format("------ END DUMP RESOURCES %s (%s)  ------",
                        app.processName,
                        app.info.packageName));
                pw.flush();
            });
        }
    }