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

Commit 131f00e3 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Wrap updateLruProcessLocked in a PSC method

Flag: EXEMPT pure refactor
Fixes: 435533997
Test: atest MockingOomadjusterTests
Change-Id: I985a6f7e2a7eea52c52a3dbe1c7472f350d2d8d5
parent a4de423c
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -2491,6 +2491,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        mProcessStateController = new ProcessStateController.Builder(this, mProcessList, activeUids)
        mProcessStateController = new ProcessStateController.Builder(this, mProcessList, activeUids)
                .setLockObject(this)
                .setLockObject(this)
                .setTopProcessChangeCallback(this::updateTopAppListeners)
                .setTopProcessChangeCallback(this::updateTopAppListeners)
                .setProcessLruUpdater(mProcessList)
                .build();
                .build();
        mOomAdjuster = mProcessStateController.getOomAdjuster();
        mOomAdjuster = mProcessStateController.getOomAdjuster();
@@ -2892,12 +2893,12 @@ public class ActivityManagerService extends IActivityManager.Stub
    @GuardedBy("this")
    @GuardedBy("this")
    final void updateLruProcessLocked(ProcessRecord app, boolean activityChange,
    final void updateLruProcessLocked(ProcessRecord app, boolean activityChange,
            ProcessRecord client) {
            ProcessRecord client) {
        mProcessList.updateLruProcessLocked(app, activityChange, client);
        mProcessStateController.updateLruProcess(app, activityChange, client);
    }
    }
    @GuardedBy("this")
    @GuardedBy("this")
    final void removeLruProcessLocked(ProcessRecord app) {
    final void removeLruProcessLocked(ProcessRecord app) {
        mProcessList.removeLruProcessLocked(app);
        mProcessStateController.removeLruProcess(app);
    }
    }
    @GuardedBy("this")
    @GuardedBy("this")
+1 −1
Original line number Original line Diff line number Diff line
@@ -1484,7 +1484,7 @@ public class ContentProviderHelper {
            // the "getContentProviderImpl" tag here, because it's part
            // the "getContentProviderImpl" tag here, because it's part
            // of the checktime log in getContentProviderImpl().
            // of the checktime log in getContentProviderImpl().
            checkTime(startTime, "getContentProviderImpl: before updateLruProcess");
            checkTime(startTime, "getContentProviderImpl: before updateLruProcess");
            processList.updateLruProcessLocked(cpr.proc, false, null);
            mService.mProcessStateController.updateLruProcess(cpr.proc, false, null);
            checkTime(startTime, "getContentProviderImpl: after updateLruProcess");
            checkTime(startTime, "getContentProviderImpl: after updateLruProcess");
        }
        }
        return conn;
        return conn;
+8 −5
Original line number Original line Diff line number Diff line
@@ -180,7 +180,7 @@ import java.util.function.Function;
/**
/**
 * Activity manager code dealing with processes.
 * Activity manager code dealing with processes.
 */
 */
public final class ProcessList {
public final class ProcessList implements ProcessStateController.ProcessLruUpdater {
    static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessList" : TAG_AM;
    static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessList" : TAG_AM;


    static final String TAG_PROCESS_OBSERVERS = TAG + POSTFIX_PROCESS_OBSERVERS;
    static final String TAG_PROCESS_OBSERVERS = TAG + POSTFIX_PROCESS_OBSERVERS;
@@ -2946,7 +2946,8 @@ public final class ProcessList {
    }
    }


    @GuardedBy("mService")
    @GuardedBy("mService")
    void removeLruProcessLocked(ProcessRecord app) {
    @Override
    public void removeLruProcessLocked(ProcessRecord app) {
        int lrui = mLruProcesses.lastIndexOf(app);
        int lrui = mLruProcesses.lastIndexOf(app);
        if (lrui >= 0) {
        if (lrui >= 0) {
            synchronized (mProcLock) {
            synchronized (mProcLock) {
@@ -3255,7 +3256,7 @@ public final class ProcessList {
            mService.handleAppDiedLocked(app, pid, willRestart, allowRestart,
            mService.handleAppDiedLocked(app, pid, willRestart, allowRestart,
                    false /* fromBinderDied */);
                    false /* fromBinderDied */);
            if (willRestart) {
            if (willRestart) {
                removeLruProcessLocked(app);
                mService.mProcessStateController.removeLruProcess(app);
                mService.addAppLocked(app.info, null, false, null /* ABI override */,
                mService.addAppLocked(app.info, null, false, null /* ABI override */,
                        ZYGOTE_POLICY_FLAG_EMPTY);
                        ZYGOTE_POLICY_FLAG_EMPTY);
            }
            }
@@ -3928,7 +3929,9 @@ public final class ProcessList {
    }
    }


    @GuardedBy("mService")
    @GuardedBy("mService")
    void updateLruProcessLocked(ProcessRecord app, boolean activityChange, ProcessRecord client) {
    @Override
    public void updateLruProcessLocked(ProcessRecord app, boolean activityChange,
            ProcessRecord client) {
        final ProcessServiceRecord psr = app.mServices;
        final ProcessServiceRecord psr = app.mServices;
        final boolean hasActivity = app.hasActivitiesOrRecentTasks() || psr.hasClientActivities()
        final boolean hasActivity = app.hasActivitiesOrRecentTasks() || psr.hasClientActivities()
                || psr.isTreatedLikeActivity();
                || psr.isTreatedLikeActivity();
@@ -5542,7 +5545,7 @@ public final class ProcessList {
            app.setDyingPid(0);
            app.setDyingPid(0);
            handlePrecedingAppDiedLocked(app);
            handlePrecedingAppDiedLocked(app);
            // Remove from the LRU list if it's still there.
            // Remove from the LRU list if it's still there.
            removeLruProcessLocked(app);
            mService.mProcessStateController.removeLruProcess(app);
            return true;
            return true;
        }
        }
        return false;
        return false;
+54 −2
Original line number Original line Diff line number Diff line
@@ -64,6 +64,8 @@ public class ProcessStateController {


    private final Consumer<ProcessRecord> mTopChangeCallback;
    private final Consumer<ProcessRecord> mTopChangeCallback;


    private final ProcessLruUpdater mProcessLruUpdater;

    private final GlobalState mGlobalState = new GlobalState();
    private final GlobalState mGlobalState = new GlobalState();


    /**
    /**
@@ -74,13 +76,15 @@ public class ProcessStateController {
    private ProcessStateController(ActivityManagerService ams, ProcessList processList,
    private ProcessStateController(ActivityManagerService ams, ProcessList processList,
            ActiveUids activeUids, ServiceThread handlerThread,
            ActiveUids activeUids, ServiceThread handlerThread,
            CachedAppOptimizer cachedAppOptimizer, Object lock, Object procLock,
            CachedAppOptimizer cachedAppOptimizer, Object lock, Object procLock,
            Consumer<ProcessRecord> topChangeCallback, OomAdjuster.Injector oomAdjInjector) {
            Consumer<ProcessRecord> topChangeCallback, ProcessLruUpdater lruUpdater,
            OomAdjuster.Injector oomAdjInjector) {
        mOomAdjuster = new OomAdjusterImpl(ams, processList, activeUids, handlerThread,
        mOomAdjuster = new OomAdjusterImpl(ams, processList, activeUids, handlerThread,
                mGlobalState, cachedAppOptimizer, oomAdjInjector);
                mGlobalState, cachedAppOptimizer, oomAdjInjector);


        mLock = lock;
        mLock = lock;
        mProcLock = procLock;
        mProcLock = procLock;
        mTopChangeCallback = topChangeCallback;
        mTopChangeCallback = topChangeCallback;
        mProcessLruUpdater = lruUpdater;
        final Handler serviceHandler = new Handler(handlerThread.getLooper());
        final Handler serviceHandler = new Handler(handlerThread.getLooper());
        mServiceBinderCallUpdater = (cr, hasOngoingCalls) -> serviceHandler.post(() -> {
        mServiceBinderCallUpdater = (cr, hasOngoingCalls) -> serviceHandler.post(() -> {
            synchronized (ams) {
            synchronized (ams) {
@@ -384,6 +388,23 @@ public class ProcessStateController {
        }
        }
    }
    }


    /**
     * Bump a process to the end of the LRU list.
     */
    @GuardedBy("mLock")
    public void updateLruProcess(@NonNull ProcessRecord proc, boolean activityChange,
            @Nullable ProcessRecord client) {
        mProcessLruUpdater.updateLruProcessLocked(proc, activityChange, client);
    }

    /**
     * Remove a process from the LRU list.
     */
    @GuardedBy("mLock")
    public void removeLruProcess(@NonNull ProcessRecord proc) {
        mProcessLruUpdater.removeLruProcessLocked(proc);
    }

    /********************* Process Visibility State Events *********************/
    /********************* Process Visibility State Events *********************/
    /**
    /**
     * Note whether a process has Top UI or not.
     * Note whether a process has Top UI or not.
@@ -1108,6 +1129,19 @@ public class ProcessStateController {
        }
        }
    }
    }


    /**
     * Interface for injecting LRU management into ProcessStateController
     * TODO(b/430385382): This should be remove when LRU is managed entirely within
     * ProcessStateController.
     */
    public interface ProcessLruUpdater {
        /** Bump a process to the end of the LRU list */
        void updateLruProcessLocked(ProcessRecord app, boolean activityChange,
                ProcessRecord client);
        /** Remove a process from the LRU list */
        void removeLruProcessLocked(ProcessRecord app);
    }

    /**
    /**
     * Builder for ProcessStateController.
     * Builder for ProcessStateController.
     */
     */
@@ -1120,6 +1154,7 @@ public class ProcessStateController {
        private CachedAppOptimizer mCachedAppOptimizer = null;
        private CachedAppOptimizer mCachedAppOptimizer = null;
        private Object mLock = null;
        private Object mLock = null;
        private Consumer<ProcessRecord> mTopChangeCallback = null;
        private Consumer<ProcessRecord> mTopChangeCallback = null;
        private ProcessLruUpdater mProcessLruUpdater = null;
        private OomAdjuster.Injector mOomAdjInjector = null;
        private OomAdjuster.Injector mOomAdjInjector = null;


        public Builder(ActivityManagerService ams, ProcessList processList, ActiveUids activeUids) {
        public Builder(ActivityManagerService ams, ProcessList processList, ActiveUids activeUids) {
@@ -1144,12 +1179,20 @@ public class ProcessStateController {
            if (mTopChangeCallback == null) {
            if (mTopChangeCallback == null) {
                mTopChangeCallback = proc -> {};
                mTopChangeCallback = proc -> {};
            }
            }
            if (mProcessLruUpdater == null) {
                // Just attach a no-op updater. For Testing that does not care about the LRU.
                mProcessLruUpdater = new ProcessLruUpdater() {
                    public void updateLruProcessLocked(ProcessRecord app, boolean activityChange,
                            ProcessRecord client) {}
                    public void removeLruProcessLocked(ProcessRecord app) {}
                };
            }
            if (mOomAdjInjector == null) {
            if (mOomAdjInjector == null) {
                mOomAdjInjector = new OomAdjuster.Injector();
                mOomAdjInjector = new OomAdjuster.Injector();
            }
            }
            return new ProcessStateController(mAms, mProcessList, mActiveUids, mHandlerThread,
            return new ProcessStateController(mAms, mProcessList, mActiveUids, mHandlerThread,
                    mCachedAppOptimizer, mLock, mAms.mProcLock, mTopChangeCallback,
                    mCachedAppOptimizer, mLock, mAms.mProcLock, mTopChangeCallback,
                    mOomAdjInjector);
                    mProcessLruUpdater, mOomAdjInjector);
        }
        }


        /**
        /**
@@ -1195,5 +1238,14 @@ public class ProcessStateController {
            mTopChangeCallback = callback;
            mTopChangeCallback = callback;
            return this;
            return this;
        }
        }

        /**
         * Set a callback for when ProcessStateController is informed about the Top process
         * changing.
         */
        public Builder setProcessLruUpdater(ProcessLruUpdater updater) {
            mProcessLruUpdater = updater;
            return this;
        }
    }
    }
}
}
+26 −11
Original line number Original line Diff line number Diff line
@@ -135,6 +135,7 @@ import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.util.SparseIntArray;


import com.android.server.LocalServices;
import com.android.server.LocalServices;
import com.android.server.am.ProcessStateController.ProcessLruUpdater;
import com.android.server.am.psc.ProcessRecordInternal;
import com.android.server.am.psc.ProcessRecordInternal;
import com.android.server.wm.ActivityServiceConnectionsHolder;
import com.android.server.wm.ActivityServiceConnectionsHolder;
import com.android.server.wm.ActivityTaskManagerService;
import com.android.server.wm.ActivityTaskManagerService;
@@ -152,7 +153,6 @@ import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
@@ -283,9 +283,25 @@ public class MockingOomAdjusterTests {
        mActivityStateHandlerThread = new HandlerThread("ActivityStateThread");
        mActivityStateHandlerThread = new HandlerThread("ActivityStateThread");
        mActivityStateHandlerThread.start();
        mActivityStateHandlerThread.start();
        mActivityStateHandler = new Handler(mActivityStateHandlerThread.getLooper());
        mActivityStateHandler = new Handler(mActivityStateHandlerThread.getLooper());
        ProcessLruUpdater lruUpdater = new ProcessLruUpdater() {
            @Override
            public void updateLruProcessLocked(ProcessRecord app, boolean activityChange,
                    ProcessRecord client) {
                ArrayList<ProcessRecord> lru = mService.mProcessList.getLruProcessesLOSP();
                lru.remove(app);
                lru.add(app);
            }

            @Override
            public void removeLruProcessLocked(ProcessRecord app) {
                ArrayList<ProcessRecord> lru = mService.mProcessList.getLruProcessesLOSP();
                lru.remove(app);
            }
        };
        mProcessStateController = new ProcessStateController.Builder(mService,
        mProcessStateController = new ProcessStateController.Builder(mService,
                mService.mProcessList, mActiveUids)
                mService.mProcessList, mActiveUids)
                .setCachedAppOptimizer(mTestCachedAppOptimizer)
                .setCachedAppOptimizer(mTestCachedAppOptimizer)
                .setProcessLruUpdater(lruUpdater)
                .setOomAdjusterInjector(mInjector)
                .setOomAdjusterInjector(mInjector)
                .build();
                .build();
        mActivityStateAsyncUpdater = mProcessStateController.createActivityStateAsyncUpdater(
        mActivityStateAsyncUpdater = mProcessStateController.createActivityStateAsyncUpdater(
@@ -372,14 +388,15 @@ public class MockingOomAdjusterTests {
        assertCapability(false, app, PROCESS_CAPABILITY_BFSL);
        assertCapability(false, app, PROCESS_CAPABILITY_BFSL);
    }
    }


    /**
     * Replace the process LRU with the given processes.
     */
    @SuppressWarnings("GuardedBy")
    @SuppressWarnings("GuardedBy")
    private void setProcessesToLru(ProcessRecord... apps) {
    private void setProcessesToLru(ProcessRecord... apps) {
        ArrayList<ProcessRecord> lru = mService.mProcessList.getLruProcessesLOSP();
        for (ProcessRecord app : apps) {
        lru.clear();
            updateProcessLru(app);
        Collections.addAll(lru, apps);
        }
    }

    private void updateProcessLru(ProcessRecord app) {
        mProcessStateController.updateLruProcess(app, false, null);
    }
    }


    /**
    /**
@@ -397,10 +414,8 @@ public class MockingOomAdjusterTests {
            updateProcessRecordNodes(Arrays.asList(apps));
            updateProcessRecordNodes(Arrays.asList(apps));
            if (apps.length == 1) {
            if (apps.length == 1) {
                final ProcessRecord app = apps[0];
                final ProcessRecord app = apps[0];
                if (!mService.mProcessList.getLruProcessesLOSP().contains(app)) {
                updateProcessLru(app);
                    mService.mProcessList.getLruProcessesLOSP().add(app);
                mProcessStateController.runUpdate(app, OOM_ADJ_REASON_NONE);
                }
                mProcessStateController.runUpdate(apps[0], OOM_ADJ_REASON_NONE);
            } else {
            } else {
                setProcessesToLru(apps);
                setProcessesToLru(apps);
                mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE);
                mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE);