Merge "Deferred BOOT_COMPLETED broadcast does not mean queue is not idle." into tm-dev am: 525fad6cb2

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17779272

Change-Id: Id5e5a9a60e77123742770426e8a5de9b6e9a550a
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Hui Yu
2022-04-16 22:13:08 +00:00
committed by Automerger Merge Worker
3 changed files with 17 additions and 5 deletions

View File

@@ -15093,7 +15093,7 @@ public class ActivityManagerService extends IActivityManager.Stub
@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;
}
}

View File

@@ -511,13 +511,25 @@ public class BroadcastDispatcher {
* Standard contents-are-empty check
*/
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);
}
}

View File

@@ -2218,7 +2218,7 @@ public final class BroadcastQueue {
}
boolean isIdle() {
return mParallelBroadcasts.isEmpty() && mDispatcher.isEmpty()
return mParallelBroadcasts.isEmpty() && mDispatcher.isIdle()
&& (mPendingBroadcast == null);
}