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

Commit 534de0bf authored by Chih-Yu Huang's avatar Chih-Yu Huang
Browse files

psc: UidRecordInternal manages ProcessRecordInternal directly

This change renames UidStateRecord to UidRecordInternal, and moves
process management methods (addProcess, removeProcess,
getProcessRecordByIndex) from UidRecord to UidRecordInternal. This allows
UidRecordInternal to directly manage ProcessRecordInternal instances,
improving abstraction within the Process State Controller (PSC).

UidRecord now overrides these methods, casting to ProcessRecord
where necessary, as it holds specific ProcessRecord objects.

Bug: 425766486
Test: m services.core
Test: atest MockingOomAdjusterTests OomAdjusterTests
Test: atest FrameworksServicesTestsRavenwood_ProcessStateController
Flag: EXEMPT pure refactor

Change-Id: I555afda45c9770835d3ae290b3697dbb4549651d
parent 52aa1cc1
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;

import com.android.server.am.psc.ActiveUidsInternal;
import com.android.server.am.psc.UidStateRecord;
import com.android.server.am.psc.UidRecordInternal;

import java.io.PrintWriter;

@@ -68,8 +68,8 @@ public final class ActiveUids implements ActiveUidsInternal {
    }

    @Override
    public void put(int uid, UidStateRecord value) {
        // Only UidRecord implements the UidStateRecord, so it's safe to cast directly.
    public void put(int uid, UidRecordInternal value) {
        // Only UidRecord implements the UidRecordInternal, so it's safe to cast directly.
        put(uid, (UidRecord) value);
    }

+7 −6
Original line number Diff line number Diff line
@@ -150,7 +150,7 @@ import com.android.server.am.psc.ActiveUidsInternal;
import com.android.server.am.psc.PlatformCompatCache;
import com.android.server.am.psc.PlatformCompatCache.CachedCompatChangeId;
import com.android.server.am.psc.ProcessRecordInternal;
import com.android.server.am.psc.UidStateRecord;
import com.android.server.am.psc.UidRecordInternal;
import com.android.server.wm.WindowProcessController;

import java.io.PrintWriter;
@@ -345,7 +345,8 @@ public abstract class OomAdjuster {
    private final int mNumSlots;
    protected final ArrayList<ProcessRecord> mTmpProcessList = new ArrayList<ProcessRecord>();
    protected final ArrayList<ProcessRecord> mTmpProcessList2 = new ArrayList<ProcessRecord>();
    protected final ArrayList<UidStateRecord> mTmpBecameIdle = new ArrayList<UidStateRecord>();
    protected final ArrayList<UidRecordInternal> mTmpBecameIdle =
            new ArrayList<UidRecordInternal>();
    protected final ActiveUids mTmpUidRecords;
    protected final ArrayDeque<ProcessRecord> mTmpQueue;
    protected final ArraySet<ProcessRecord> mTmpProcessSet = new ArraySet<>();
@@ -1334,7 +1335,7 @@ public abstract class OomAdjuster {

    @GuardedBy({"mService", "mProcLock"})
    private void updateAppUidRecLSP(ProcessRecord app) {
        final UidStateRecord uidRec = app.getUidRecord();
        final UidRecordInternal uidRec = app.getUidRecord();
        if (uidRec != null) {
            final ProcessRecordInternal state = app;
            uidRec.setEphemeral(app.info.isInstantApp());
@@ -1355,7 +1356,7 @@ public abstract class OomAdjuster {
        // we update the UidRecord's procstate by calling {@link UidRecord#setSetProcState}.
        mProcessList.incrementProcStateSeqAndNotifyAppsLOSP(activeUids);

        ArrayList<UidStateRecord> becameIdle = mTmpBecameIdle;
        ArrayList<UidRecordInternal> becameIdle = mTmpBecameIdle;
        becameIdle.clear();

        // Update from any uid changes.
@@ -1948,7 +1949,7 @@ public abstract class OomAdjuster {
    protected static int getCpuCapability(ProcessRecord app, long nowUptime,
            boolean hasForegroundActivities) {
        // Note: persistent processes get all capabilities, including CPU_TIME.
        final UidStateRecord uidRec = app.getUidRecord();
        final UidRecordInternal uidRec = app.getUidRecord();
        if (uidRec != null && uidRec.isCurAllowListed()) {
            // Process is in the power allowlist.
            return PROCESS_CAPABILITY_CPU_TIME;
@@ -2075,7 +2076,7 @@ public abstract class OomAdjuster {
            long nowElapsed, @OomAdjReason int oomAdjReson, boolean isBatchingOomAdj) {
        boolean success = true;
        final ProcessRecordInternal state = app;
        final UidStateRecord uidRec = app.getUidRecord();
        final UidRecordInternal uidRec = app.getUidRecord();

        if (state.getCurRawAdj() != state.getSetRawAdj()) {
            state.setSetRawAdj(state.getCurRawAdj());
+3 −3
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.ServiceThread;
import com.android.server.am.psc.ActiveUidsInternal;
import com.android.server.am.psc.ProcessRecordInternal;
import com.android.server.am.psc.UidStateRecord;
import com.android.server.am.psc.UidRecordInternal;
import com.android.server.wm.ActivityServiceConnectionsHolder;

import java.lang.annotation.Retention;
@@ -768,7 +768,7 @@ public class OomAdjusterImpl extends OomAdjuster {
        for (int i = lru.size() - 1; i >= 0; i--) {
            final ProcessRecord app = lru.get(i);
            app.resetCachedInfo();
            final UidStateRecord uidRec = app.getUidRecord();
            final UidRecordInternal uidRec = app.getUidRecord();
            if (uidRec != null) {
                if (DEBUG_UID_OBSERVERS) {
                    Slog.i(TAG_UID_OBSERVERS, "Starting update of " + uidRec);
@@ -1192,7 +1192,7 @@ public class OomAdjusterImpl extends OomAdjuster {
        state.setAdjTarget(null);

        // If this UID is currently allowlisted, it should not be frozen.
        final UidStateRecord uidRec = app.getUidRecord();
        final UidRecordInternal uidRec = app.getUidRecord();
        app.mOptRecord.setShouldNotFreeze(uidRec != null && uidRec.isCurAllowListed(),
                ProcessCachedOptimizerRecord.SHOULD_NOT_FREEZE_REASON_UID_ALLOWLISTED, mAdjSeq);

+4 −4
Original line number Diff line number Diff line
@@ -148,7 +148,7 @@ import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerService.ProcessChangeItem;
import com.android.server.am.psc.PlatformCompatCache;
import com.android.server.am.psc.ProcessRecordInternal;
import com.android.server.am.psc.UidStateRecord;
import com.android.server.am.psc.UidRecordInternal;
import com.android.server.compat.PlatformCompat;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageStateInternal;
@@ -5306,7 +5306,7 @@ public final class ProcessList {
     */
    @GuardedBy(anyOf = {"mService", "mProcLock"})
    int getUidProcStateLOSP(int uid) {
        UidStateRecord uidRec = mActiveUids.get(uid);
        UidRecordInternal uidRec = mActiveUids.get(uid);
        return uidRec == null ? PROCESS_STATE_NONEXISTENT : uidRec.getCurProcState();
    }

@@ -5316,7 +5316,7 @@ public final class ProcessList {
     */
    @GuardedBy(anyOf = {"mService", "mProcLock"})
    @ProcessCapability int getUidProcessCapabilityLOSP(int uid) {
        UidStateRecord uidRec = mActiveUids.get(uid);
        UidRecordInternal uidRec = mActiveUids.get(uid);
        return uidRec == null ? PROCESS_CAPABILITY_NONE : uidRec.getCurCapability();
    }

@@ -5357,7 +5357,7 @@ public final class ProcessList {
     */
    @VisibleForTesting
    @GuardedBy(anyOf = {"mService", "mProcLock"})
    int getBlockStateForUid(UidStateRecord uidRec) {
    int getBlockStateForUid(UidRecordInternal uidRec) {
        // Denotes whether uid's process state is currently allowed network access.
        final boolean isAllowed =
                isProcStateAllowedWhileIdleOrPowerSaveMode(uidRec.getCurProcState(),
+13 −7
Original line number Diff line number Diff line
@@ -30,14 +30,15 @@ import android.util.proto.ProtoUtils;
import com.android.internal.annotations.CompositeRWLock;
import com.android.internal.annotations.GuardedBy;
import com.android.server.am.UidObserverController.ChangeRecord;
import com.android.server.am.psc.UidStateRecord;
import com.android.server.am.psc.ProcessRecordInternal;
import com.android.server.am.psc.UidRecordInternal;

import java.util.function.Consumer;

/**
 * Overall information about a uid that has actively running processes.
 */
public final class UidRecord extends UidStateRecord {
public final class UidRecord extends UidRecordInternal {
    @CompositeRWLock({"mService", "mProcLock"})
    private ArraySet<ProcessRecord> mProcRecords = new ArraySet<>();

@@ -148,8 +149,9 @@ public final class UidRecord extends UidStateRecord {
        }
    }

    @Override
    @GuardedBy(anyOf = {"mService", "mProcLock"})
    ProcessRecord getProcessRecordByIndex(int idx) {
    public ProcessRecord getProcessRecordByIndex(int idx) {
        return mProcRecords.valueAt(idx);
    }

@@ -201,14 +203,18 @@ public final class UidRecord extends UidStateRecord {
        return mUidIsFrozen;
    }

    @Override
    @GuardedBy({"mService", "mProcLock"})
    void addProcess(ProcessRecord app) {
        mProcRecords.add(app);
    public void addProcess(ProcessRecordInternal app) {
        // Only ProcessRecord extends ProcessRecordInternal, so it's safe to cast directly.
        mProcRecords.add((ProcessRecord) app);
    }

    @Override
    @GuardedBy({"mService", "mProcLock"})
    void removeProcess(ProcessRecord app) {
        mProcRecords.remove(app);
    public void removeProcess(ProcessRecordInternal app) {
        // Only ProcessRecord extends ProcessRecordInternal, so it's safe to cast directly.
        mProcRecords.remove((ProcessRecord) app);
    }

    @GuardedBy("mService")
Loading