summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@android.com>2011-01-18 18:54:25 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2011-01-18 18:54:25 -0800
commit6b2b053b5adf2d4f8f0defde58310a51dfb7e1e0 (patch)
tree44979581259571c8f52eb539faa32841214cf6ca /services
parentccc9a9e58247d174d587dee465868a948a07364f (diff)
parent597fa828fa2b3cba053f0afeeac877b1ee2d24b7 (diff)
downloadframeworks_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.java19
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()) {