BroadcastQueue: temporarily unfreeze for parallel broadcasts

Ensure that recipients of broadcast messages and replies are not
frozen to avoid saturation of their binder async queue.

Bug: 172001574
Test: booted device, unplugged the usb charger, verified that some
frozen processes were unfrozen

Change-Id: I1f359103984b115a91fb9134e912b80d6acbaecf
This commit is contained in:
Marco Ballesio
2020-11-03 12:55:46 -08:00
parent 49ae1cbd36
commit 8bab7db6f7
2 changed files with 17 additions and 0 deletions

View File

@@ -798,7 +798,10 @@ public final class BroadcastQueue {
mService.updateOomAdjPendingTargetsLocked(
OomAdjuster.OOM_ADJ_REASON_START_RECEIVER);
}
} else if (filter.receiverList.app != null) {
mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app);
}
try {
if (DEBUG_BROADCAST_LIGHT) Slog.i(TAG_BROADCAST,
"Delivering to " + filter + " : " + r);
@@ -1132,6 +1135,10 @@ public final class BroadcastQueue {
}
}
if (sendResult) {
if (r.callerApp != null) {
mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(
r.callerApp);
}
try {
if (DEBUG_BROADCAST) {
Slog.i(TAG_BROADCAST, "Finishing broadcast [" + mQueueName + "] "

View File

@@ -720,6 +720,16 @@ public final class CachedAppOptimizer {
}
}
// This will ensure app will be out of the freezer for at least FREEZE_TIMEOUT_MS
void unfreezeTemporarily(ProcessRecord app) {
synchronized (mAm) {
if (app.frozen) {
unfreezeAppLocked(app);
freezeAppAsync(app);
}
}
}
@GuardedBy("mAm")
void freezeAppAsync(ProcessRecord app) {
mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);