From 8bab7db6f7da9fcc5a78fef48b6e7fc3c818246d Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Tue, 3 Nov 2020 12:55:46 -0800 Subject: [PATCH] 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 --- .../java/com/android/server/am/BroadcastQueue.java | 7 +++++++ .../java/com/android/server/am/CachedAppOptimizer.java | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index f1c591522e519..0877dd96c19fc 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -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 + "] " diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index cd0d5b47c2381..36d4a38c1624f 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -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);