Merge "Deferred BOOT_COMPLETED broadcast does not mean queue is not idle." into tm-dev am: 525fad6cb2 am: 0530be1405
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17779272
Change-Id: I1364b9dc8f0b51e71963c4fc4a0ffbfc36e6851f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index aa2f7c1..9d7736f 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -15083,7 +15083,7 @@
@GuardedBy("this")
final boolean canGcNowLocked() {
for (BroadcastQueue q : mBroadcastQueues) {
- if (!q.mParallelBroadcasts.isEmpty() || !q.mDispatcher.isEmpty()) {
+ if (!q.mParallelBroadcasts.isEmpty() || !q.mDispatcher.isIdle()) {
return false;
}
}
diff --git a/services/core/java/com/android/server/am/BroadcastDispatcher.java b/services/core/java/com/android/server/am/BroadcastDispatcher.java
index 872531a..49477ad 100644
--- a/services/core/java/com/android/server/am/BroadcastDispatcher.java
+++ b/services/core/java/com/android/server/am/BroadcastDispatcher.java
@@ -512,12 +512,24 @@
*/
public boolean isEmpty() {
synchronized (mLock) {
+ return isIdle()
+ && getBootCompletedBroadcastsUidsSize(Intent.ACTION_LOCKED_BOOT_COMPLETED) == 0
+ && getBootCompletedBroadcastsUidsSize(Intent.ACTION_BOOT_COMPLETED) == 0;
+ }
+ }
+
+ /**
+ * Have less check than {@link #isEmpty()}.
+ * The dispatcher is considered as idle even with deferred LOCKED_BOOT_COMPLETED/BOOT_COMPLETED
+ * broadcasts because those can be deferred until the first time the uid's process is started.
+ * @return
+ */
+ public boolean isIdle() {
+ synchronized (mLock) {
return mCurrentBroadcast == null
&& mOrderedBroadcasts.isEmpty()
&& isDeferralsListEmpty(mDeferredBroadcasts)
- && isDeferralsListEmpty(mAlarmBroadcasts)
- && getBootCompletedBroadcastsUidsSize(Intent.ACTION_LOCKED_BOOT_COMPLETED) == 0
- && getBootCompletedBroadcastsUidsSize(Intent.ACTION_BOOT_COMPLETED) == 0;
+ && isDeferralsListEmpty(mAlarmBroadcasts);
}
}
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 8a7fece..3ba99a8 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -2218,7 +2218,7 @@
}
boolean isIdle() {
- return mParallelBroadcasts.isEmpty() && mDispatcher.isEmpty()
+ return mParallelBroadcasts.isEmpty() && mDispatcher.isIdle()
&& (mPendingBroadcast == null);
}