diff options
| author | 2023-02-17 12:35:36 -0800 | |
|---|---|---|
| committer | 2023-02-17 20:45:17 +0000 | |
| commit | 3e3b17b9677609d4773333e74773b234be78288f (patch) | |
| tree | eaa08a2fc371d84bfe9beb076e4d8dfa673d99b6 | |
| parent | 74efadf7387845552752eeade855b47bc283b6b3 (diff) | |
Compute oomAdj when delivering ordered and resultTo broadcasts.
Since we expect results from these broadcasts, trigger oomAdj
computation when delivering these so that the receivers don't
end up getting into cached/frozen state.
Bug: 267949291
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: If4e7a0551ab9f6c537c14c2a1eabf579713e5410
3 files changed, 55 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java index 6e97317a5523..84c03e59c658 100644 --- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java +++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java @@ -751,6 +751,22 @@ class BroadcastProcessQueue { } /** + * Quickly determine if this queue has ordered broadcasts waiting to be delivered, + * which indicates we should request an OOM adjust. + */ + public boolean isPendingOrdered() { + return mCountOrdered > 0; + } + + /** + * Quickly determine if this queue has broadcasts waiting to be delivered for which result is + * expected from the senders, which indicates we should request an OOM adjust. + */ + public boolean isPendingResultTo() { + return mCountResultTo > 0; + } + + /** * Report whether this queue is currently handling an urgent broadcast. */ public boolean isPendingUrgent() { diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index 5c7fde79821c..6f239ca66ef3 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -466,7 +466,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // Emit all trace events for this process into a consistent track queue.runningTraceTrackName = TAG + ".mRunning[" + queueIndex + "]"; - queue.runningOomAdjusted = queue.isPendingManifest(); + queue.runningOomAdjusted = queue.isPendingManifest() + || queue.isPendingOrdered() + || queue.isPendingResultTo(); // If already warm, we can make OOM adjust request immediately; // otherwise we need to wait until process becomes warm diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java index e7b3dd985053..7f20a552f389 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java @@ -1820,6 +1820,42 @@ public class BroadcastQueueTest { } /** + * Verify that we OOM adjust for ordered broadcast receivers. + */ + @Test + public void testOomAdjust_Ordered() throws Exception { + final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED); + + final IIntentReceiver orderedResultTo = mock(IIntentReceiver.class); + final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); + enqueueBroadcast(makeOrderedBroadcastRecord(airplane, callerApp, + List.of(makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN), + makeManifestReceiver(PACKAGE_GREEN, CLASS_BLUE), + makeManifestReceiver(PACKAGE_GREEN, CLASS_RED)), orderedResultTo, null)); + + waitForIdle(); + verify(mAms, atLeastOnce()).enqueueOomAdjTargetLocked(any()); + } + + /** + * Verify that we OOM adjust for resultTo broadcast receivers. + */ + @Test + public void testOomAdjust_ResultTo() throws Exception { + final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED); + + final IIntentReceiver resultTo = mock(IIntentReceiver.class); + final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); + enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, + List.of(makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN), + makeManifestReceiver(PACKAGE_GREEN, CLASS_BLUE), + makeManifestReceiver(PACKAGE_GREEN, CLASS_RED)), resultTo)); + + waitForIdle(); + verify(mAms, atLeastOnce()).enqueueOomAdjTargetLocked(any()); + } + + /** * Verify that we never OOM adjust for registered receivers. */ @Test |