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

Commit 0971a136 authored by Brad Fitzpatrick's avatar Brad Fitzpatrick
Browse files

Watchdog can get deadlocked on activity manager

Bug: 3351719
Change-Id: Idf3907709340062849a09dd094137e86256ed739
parent e4dd154c
Loading
Loading
Loading
Loading
+16 −3
Original line number Original line Diff line number Diff line
@@ -425,7 +425,7 @@ public class Watchdog extends Thread {
            // First collect stack traces from all threads of the system process.
            // First collect stack traces from all threads of the system process.
            // Then kill this process so that the system will restart.
            // Then kill this process so that the system will restart.


            String name = (mCurrentMonitor != null) ?
            final String name = (mCurrentMonitor != null) ?
                    mCurrentMonitor.getClass().getName() : "null";
                    mCurrentMonitor.getClass().getName() : "null";
            EventLog.writeEvent(EventLogTags.WATCHDOG, name);
            EventLog.writeEvent(EventLogTags.WATCHDOG, name);


@@ -434,7 +434,8 @@ public class Watchdog extends Thread {
            if (mPhonePid > 0) pids.add(mPhonePid);
            if (mPhonePid > 0) pids.add(mPhonePid);
            // Pass !waitedHalf so that just in case we somehow wind up here without having
            // Pass !waitedHalf so that just in case we somehow wind up here without having
            // dumped the halfway stacks, we properly re-initialize the trace file.
            // dumped the halfway stacks, we properly re-initialize the trace file.
            File stack = ActivityManagerService.dumpStackTraces(!waitedHalf, pids, null, null);
            final File stack = ActivityManagerService.dumpStackTraces(
                    !waitedHalf, pids, null, null);


            // Give some extra time to make sure the stack traces get written.
            // Give some extra time to make sure the stack traces get written.
            // The system's been hanging for a minute, another second or two won't hurt much.
            // The system's been hanging for a minute, another second or two won't hurt much.
@@ -445,7 +446,19 @@ public class Watchdog extends Thread {
                dumpKernelStackTraces();
                dumpKernelStackTraces();
            }
            }


            mActivity.addErrorToDropBox("watchdog", null, null, null, name, null, stack, null);
            // Try to add the error to the dropbox, but assuming that the ActivityManager
            // itself may be deadlocked.  (which has happened, causing this statement to
            // deadlock and the watchdog as a whole to be ineffective)
            Thread dropboxThread = new Thread("watchdogWriteToDropbox") {
                    public void run() {
                        mActivity.addErrorToDropBox(
                                "watchdog", null, null, null, name, null, stack, null);
                    }
                };
            dropboxThread.start();
            try {
                dropboxThread.join(2000);  // wait up to 2 seconds for it to return.
            } catch (InterruptedException ignored) {}


            // Only kill the process if the debugger is not attached.
            // Only kill the process if the debugger is not attached.
            if (!Debug.isDebuggerConnected()) {
            if (!Debug.isDebuggerConnected()) {