diff options
author | Brad Fitzpatrick <bradfitz@android.com> | 2011-01-18 18:54:25 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-01-18 18:54:25 -0800 |
commit | 6b2b053b5adf2d4f8f0defde58310a51dfb7e1e0 (patch) | |
tree | 44979581259571c8f52eb539faa32841214cf6ca /services | |
parent | ccc9a9e58247d174d587dee465868a948a07364f (diff) | |
parent | 597fa828fa2b3cba053f0afeeac877b1ee2d24b7 (diff) | |
download | frameworks_base-6b2b053b5adf2d4f8f0defde58310a51dfb7e1e0.zip frameworks_base-6b2b053b5adf2d4f8f0defde58310a51dfb7e1e0.tar.gz frameworks_base-6b2b053b5adf2d4f8f0defde58310a51dfb7e1e0.tar.bz2 |
am 597fa828: Merge "Watchdog can get deadlocked on activity manager" into gingerbread
* commit '597fa828fa2b3cba053f0afeeac877b1ee2d24b7':
Watchdog can get deadlocked on activity manager
Diffstat (limited to 'services')
-rw-r--r-- | services/java/com/android/server/Watchdog.java | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java index 1b885f5..2a25c2a 100644 --- a/services/java/com/android/server/Watchdog.java +++ b/services/java/com/android/server/Watchdog.java @@ -425,7 +425,7 @@ public class Watchdog extends Thread { // First collect stack traces from all threads of the system process. // Then kill this process so that the system will restart. - String name = (mCurrentMonitor != null) ? + final String name = (mCurrentMonitor != null) ? mCurrentMonitor.getClass().getName() : "null"; EventLog.writeEvent(EventLogTags.WATCHDOG, name); @@ -434,7 +434,8 @@ public class Watchdog extends Thread { if (mPhonePid > 0) pids.add(mPhonePid); // 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. - 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. // 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(); } - 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. if (!Debug.isDebuggerConnected()) { |