diff options
| author | 2023-02-18 19:55:00 +0000 | |
|---|---|---|
| committer | 2023-02-18 19:55:00 +0000 | |
| commit | 3416fd5f6041e562c12c4b5c5fc3d000b34dbb1b (patch) | |
| tree | 6bddc97de0fd8936cdf201a61b1ee39b7152faf2 | |
| parent | 3a7b04408664f581d0b507e4fd3c03dd94ca9e83 (diff) | |
| parent | 3e3b17b9677609d4773333e74773b234be78288f (diff) | |
Merge "Compute oomAdj when delivering ordered and resultTo broadcasts." into udc-dev
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 361f8bb86eee..b942f4b96b21 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 f3c201277d8f..cf8460bca1a6 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java @@ -1822,6 +1822,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 |