summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kenji Sugimoto <kenji.xb.sugimoto@sonymobile.com> 2014-07-17 14:50:41 +0900
committer Craig Mautner <cmautner@google.com> 2014-12-04 11:02:36 -0800
commitd088027ff16025d7153afcbc637d0881f3ff029a (patch)
treef18212da4c8510bac8cca5318bfc5190a4626b1c
parent932c33214729fe2d2b09f82ef60a72871f182654 (diff)
Prevent ANR when broadcast receiver is killed
Cherry-picked from aosp Fixes bug 18613138. If the process of a BroacastReceiver is dying at the same time as the system is trying to send an ordered broadcast to the receiver, the system will try to start the process again. The BroadcastQueue will store the BroadcastRecord in mPendingBroadcast to be able to handle it again when the process is awake. A timeout Message is posted to the handler of the BroadcastQueue. As part of the shutdown sequence skipCurrentReceiver is called for the ProcessRecord. This will check if there is a curReceiver set for the application and make sure to finish the receiver. Each of the foreground and background BroadcastQueues have their own handler for managing broadcast timeouts. If the wrong BroadcastQueue finishes the receiver, the pending timeout Message will never be cancelled, leading to an ANR report for a receiver that has already been finished. Change-Id: I960c0d8f1a8b739b54a8f09f496b32a3498b9e9a
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueue.java2
1 files changed, 1 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index e01b98361fa4..48d47a7d9bce 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -296,7 +296,7 @@ public final class BroadcastQueue {
public void skipCurrentReceiverLocked(ProcessRecord app) {
boolean reschedule = false;
BroadcastRecord r = app.curReceiver;
- if (r != null) {
+ if (r != null && r.queue == this) {
// The current broadcast is waiting for this app's receiver
// to be finished. Looks like that's not going to happen, so
// let the broadcast continue.