From 580d000d29551d7a90743741f259d40d732fe164 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 9 Nov 2022 10:31:12 -0700 Subject: [PATCH] BroadcastQueue: fix proto dump regression. The underlying test here is assuming that a broadcast with an empty list of receivers is still listed in the dump output, so factor out notifyFinishBroadcast() to call in this situation. Also replace flaky sleep() with "wait-for-broadcast-barrier". Bug: 256174447 Test: atest CtsIncidentHostTestCases:ActivityManagerIncidentTest#testDumpBroadcasts Change-Id: If60bcfff3f0509e976dec2842dce77c5412d5505 --- .../server/am/BroadcastQueueModernImpl.java | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index c3839a99ba529..6793876942f63 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -599,6 +599,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // If nothing to dispatch, send any pending result immediately if (r.receivers.isEmpty()) { scheduleResultTo(r); + notifyFinishBroadcast(r); } traceEnd(cookie); @@ -1402,30 +1403,34 @@ class BroadcastQueueModernImpl extends BroadcastQueue { final boolean recordFinished = (r.terminalCount == r.receivers.size()); if (recordFinished) { - mService.notifyBroadcastFinishedLocked(r); - mHistory.addBroadcastToHistoryLocked(r); + notifyFinishBroadcast(r); + } + } - r.finishTime = SystemClock.uptimeMillis(); - r.nextReceiver = r.receivers.size(); - BroadcastQueueImpl.logBootCompletedBroadcastCompletionLatencyIfPossible(r); + private void notifyFinishBroadcast(@NonNull BroadcastRecord r) { + mService.notifyBroadcastFinishedLocked(r); + mHistory.addBroadcastToHistoryLocked(r); - if (r.intent.getComponent() == null && r.intent.getPackage() == null - && (r.intent.getFlags() & Intent.FLAG_RECEIVER_REGISTERED_ONLY) == 0) { - int manifestCount = 0; - int manifestSkipCount = 0; - for (int i = 0; i < r.receivers.size(); i++) { - if (r.receivers.get(i) instanceof ResolveInfo) { - manifestCount++; - if (r.delivery[i] == BroadcastRecord.DELIVERY_SKIPPED) { - manifestSkipCount++; - } + r.finishTime = SystemClock.uptimeMillis(); + r.nextReceiver = r.receivers.size(); + BroadcastQueueImpl.logBootCompletedBroadcastCompletionLatencyIfPossible(r); + + if (r.intent.getComponent() == null && r.intent.getPackage() == null + && (r.intent.getFlags() & Intent.FLAG_RECEIVER_REGISTERED_ONLY) == 0) { + int manifestCount = 0; + int manifestSkipCount = 0; + for (int i = 0; i < r.receivers.size(); i++) { + if (r.receivers.get(i) instanceof ResolveInfo) { + manifestCount++; + if (r.delivery[i] == BroadcastRecord.DELIVERY_SKIPPED) { + manifestSkipCount++; } } - - final long dispatchTime = SystemClock.uptimeMillis() - r.enqueueTime; - mService.addBroadcastStatLocked(r.intent.getAction(), r.callerPackage, - manifestCount, manifestSkipCount, dispatchTime); } + + final long dispatchTime = SystemClock.uptimeMillis() - r.enqueueTime; + mService.addBroadcastStatLocked(r.intent.getAction(), r.callerPackage, + manifestCount, manifestSkipCount, dispatchTime); } }