From acbe214d99f689ffb99cab760da7d6bea4ae2735 Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Fri, 12 May 2023 19:02:03 -0700 Subject: [PATCH] Make flushing broadcast loopers optional. In some cases, it takes a while for the background thread looper to finish and it seems unnecessary to increase runtime of existing clients if they don't require this or if there are no pending broadcasts waiting to be sent in these loopers. If clients require this behavior, they can always use the new option to force it. Bug: 280316424 Test: atest services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java Test: atest services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java Change-Id: Iee5367dd02ba9e1878fe1d7c0920cf6c0c1c1e2a --- .../android/server/am/ActivityManagerService.java | 12 +++++++----- .../server/am/ActivityManagerShellCommand.java | 12 +++++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a4cd2780bec6a..199c3594ae0a3 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -18875,12 +18875,14 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void waitForBroadcastIdle() { - waitForBroadcastIdle(LOG_WRITER_INFO); + waitForBroadcastIdle(LOG_WRITER_INFO, false); } - public void waitForBroadcastIdle(@NonNull PrintWriter pw) { + void waitForBroadcastIdle(@NonNull PrintWriter pw, boolean flushBroadcastLoopers) { enforceCallingPermission(permission.DUMP, "waitForBroadcastIdle()"); - BroadcastLoopers.waitForIdle(pw); + if (flushBroadcastLoopers) { + BroadcastLoopers.waitForIdle(pw); + } for (BroadcastQueue queue : mBroadcastQueues) { queue.waitForIdle(pw); } @@ -18893,7 +18895,7 @@ public class ActivityManagerService extends IActivityManager.Stub waitForBroadcastBarrier(LOG_WRITER_INFO, false, false); } - public void waitForBroadcastBarrier(@NonNull PrintWriter pw, + void waitForBroadcastBarrier(@NonNull PrintWriter pw, boolean flushBroadcastLoopers, boolean flushApplicationThreads) { enforceCallingPermission(permission.DUMP, "waitForBroadcastBarrier()"); if (flushBroadcastLoopers) { @@ -18911,7 +18913,7 @@ public class ActivityManagerService extends IActivityManager.Stub * Wait for all pending {@link IApplicationThread} events to be processed in * all currently running apps. */ - public void waitForApplicationBarrier(@NonNull PrintWriter pw) { + void waitForApplicationBarrier(@NonNull PrintWriter pw) { final CountDownLatch finishedLatch = new CountDownLatch(1); final AtomicInteger pingCount = new AtomicInteger(0); final AtomicInteger pongCount = new AtomicInteger(0); diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 8759e3f207c4f..798e5791bc6ae 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -3445,7 +3445,17 @@ final class ActivityManagerShellCommand extends ShellCommand { int runWaitForBroadcastIdle(PrintWriter pw) throws RemoteException { pw = new PrintWriter(new TeeWriter(LOG_WRITER_INFO, pw)); - mInternal.waitForBroadcastIdle(pw); + boolean flushBroadcastLoopers = false; + String opt; + while ((opt = getNextOption()) != null) { + if (opt.equals("--flush-broadcast-loopers")) { + flushBroadcastLoopers = true; + } else { + getErrPrintWriter().println("Error: Unknown option: " + opt); + return -1; + } + } + mInternal.waitForBroadcastIdle(pw, flushBroadcastLoopers); return 0; }