From d48202e156b82079d133772d08af697080c4567f Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 26 Oct 2022 10:11:36 -0600 Subject: [PATCH 1/2] Subtle fix when queue becomes unrunnable. When broadcasts are skipped or failed during list traversal, we might encounter a queue that is no longer runnable; skip it. Also add new mPendingUrgent contents to dumpsys output. Bug: 253906105 Test: atest FrameworksMockingServicesTests:BroadcastRecordTest Test: atest FrameworksMockingServicesTests:BroadcastQueueTest Test: atest FrameworksMockingServicesTests:BroadcastQueueModernImplTest Change-Id: Ib85f3f33a9475cd4cd35f04afbc548e386b75c60 --- .../java/com/android/server/am/BroadcastProcessQueue.java | 6 +++++- .../com/android/server/am/BroadcastQueueModernImpl.java | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java index 5123517e272d3..de21996ac9cd2 100644 --- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java +++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java @@ -807,7 +807,7 @@ class BroadcastProcessQueue { @NeverCompile public void dumpLocked(@UptimeMillisLong long now, @NonNull IndentingPrintWriter pw) { - if ((mActive == null) && mPending.isEmpty()) return; + if ((mActive == null) && isEmpty()) return; pw.print(toShortString()); if (isRunnable()) { @@ -823,6 +823,10 @@ class BroadcastProcessQueue { if (mActive != null) { dumpRecord(now, pw, mActive, mActiveIndex, mActiveBlockedUntilTerminalCount); } + for (SomeArgs args : mPendingUrgent) { + final BroadcastRecord r = (BroadcastRecord) args.arg1; + dumpRecord(now, pw, r, args.argi1, args.argi2); + } for (SomeArgs args : mPending) { final BroadcastRecord r = (BroadcastRecord) args.arg1; dumpRecord(now, pw, r, args.argi1, args.argi2); diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index 4c831bd47ee4c..490a484df4660 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -364,6 +364,13 @@ class BroadcastQueueModernImpl extends BroadcastQueue { BroadcastProcessQueue nextQueue = queue.runnableAtNext; final long runnableAt = queue.getRunnableAt(); + // When broadcasts are skipped or failed during list traversal, we + // might encounter a queue that is no longer runnable; skip it + if (!queue.isRunnable()) { + queue = nextQueue; + continue; + } + // If queues beyond this point aren't ready to run yet, schedule // another pass when they'll be runnable if (runnableAt > now && !waitingFor) { From cd334a0864b2b77b8c70c404f5baf9e56dae299c Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 21 Oct 2022 16:06:59 -0600 Subject: [PATCH 2/2] Enable "modern" BroadcastQueue by default; take three. We've completed several weeks of teamfooding which has helped us gain confidence in the "modern" queue, so let's pivot it enabling it by default. Bug: 253906105 Test: atest FrameworksMockingServicesTests:BroadcastRecordTest Test: atest FrameworksMockingServicesTests:BroadcastQueueTest Test: atest FrameworksMockingServicesTests:BroadcastQueueModernImplTest Change-Id: Ic51abda906a37c0fa19729e45ec1d8e35fcc95b6 --- .../core/java/com/android/server/am/BroadcastConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/BroadcastConstants.java b/services/core/java/com/android/server/am/BroadcastConstants.java index 4590c859a909c..417a0e5ede83a 100644 --- a/services/core/java/com/android/server/am/BroadcastConstants.java +++ b/services/core/java/com/android/server/am/BroadcastConstants.java @@ -133,7 +133,7 @@ public class BroadcastConstants { */ public boolean MODERN_QUEUE_ENABLED = DEFAULT_MODERN_QUEUE_ENABLED; private static final String KEY_MODERN_QUEUE_ENABLED = "modern_queue_enabled"; - private static final boolean DEFAULT_MODERN_QUEUE_ENABLED = false; + private static final boolean DEFAULT_MODERN_QUEUE_ENABLED = true; /** * For {@link BroadcastQueueModernImpl}: Maximum number of process queues to