Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5564cddb authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

BroadcastQueue: fix subtle OOM adjustment bug.

updateOomAdjPendingTargetsLocked() only takes effect for processes
that are already running as warm; it doesn't work on a process that
is still being cold started.

This change fixes the bug by making an explicit update call once
a pending cold start has become a warm process.

Bug: 255985948
Test: atest CtsAppTestCases:ActivityManagerProcessStateTest#testBackgroundCheckBroadcastService
Change-Id: I7e42984c7b7fd6e496fc9245304f1eff8ad71075
parent 2f57686a
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -412,21 +412,24 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            queue.runningTraceTrackName = TAG + ".mRunning[" + queueIndex + "]";
            queue.runningOomAdjusted = queue.isPendingManifest();

            // If already warm, we can make OOM adjust request immediately;
            // otherwise we need to wait until process becomes warm
            if (processWarm) {
                notifyStartedRunning(queue);
                updateOomAdj |= queue.runningOomAdjusted;
            }

            // If we're already warm, schedule next pending broadcast now;
            // otherwise we'll wait for the cold start to circle back around
            queue.makeActiveNextPending();
            if (processWarm) {
                queue.traceProcessRunningBegin();
                notifyStartedRunning(queue);
                scheduleReceiverWarmLocked(queue);
            } else {
                queue.traceProcessStartingBegin();
                scheduleReceiverColdLocked(queue);
            }

            // Only kick off an OOM adjustment pass if needed
            updateOomAdj |= queue.runningOomAdjusted;

            // Move to considering next runnable queue
            queue = nextQueue;
        }
@@ -464,9 +467,13 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            // now; dispatch its next broadcast and clear the slot
            mRunningColdStart = null;

            // Now that we're running warm, we can finally request that OOM
            // adjust we've been waiting for
            notifyStartedRunning(queue);
            mService.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_START_RECEIVER);

            queue.traceProcessEnd();
            queue.traceProcessRunningBegin();
            notifyStartedRunning(queue);
            scheduleReceiverWarmLocked(queue);

            // We might be willing to kick off another cold start