summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sudheer Shanka <sudheersai@google.com> 2023-02-17 12:35:36 -0800
committer Sudheer Shanka <sudheersai@google.com> 2023-02-17 20:45:17 +0000
commit3e3b17b9677609d4773333e74773b234be78288f (patch)
treeeaa08a2fc371d84bfe9beb076e4d8dfa673d99b6
parent74efadf7387845552752eeade855b47bc283b6b3 (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
-rw-r--r--services/core/java/com/android/server/am/BroadcastProcessQueue.java16
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueueModernImpl.java4
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java36
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