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

Commit b28db4ab authored by Chris Wailes's avatar Chris Wailes
Browse files

Resets the refill action/timing info after a pool fill event.

Bug: 132794985
Bug: 146614089
Test: m & flash & launch more apps than USAPs in the pool
Change-Id: I9ee74d76692fa8aeba9c70765b3e8f98ea9105bc
Merged-In: I9ee74d76692fa8aeba9c70765b3e8f98ea9105bc
parent eabbf872
Loading
Loading
Loading
Loading
+24 −11
Original line number Diff line number Diff line
@@ -143,6 +143,12 @@ class ZygoteServer {
     */
    private int mUsapPoolRefillDelayMs = -1;

    /**
     * If and when we should refill the USAP pool.
     */
    private UsapPoolRefillAction mUsapPoolRefillAction;
    private long mUsapPoolRefillTriggerTimestamp;

    private enum UsapPoolRefillAction {
        DELAYED,
        IMMEDIATE,
@@ -375,6 +381,8 @@ class ZygoteServer {
        // are re-enabled in specializeAppProcess.
        ZygoteHooks.postForkCommon();

        resetUsapRefillState();

        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

        return null;
@@ -404,6 +412,11 @@ class ZygoteServer {
        }
    }

    void resetUsapRefillState() {
        mUsapPoolRefillAction = UsapPoolRefillAction.NONE;
        mUsapPoolRefillTriggerTimestamp = INVALID_TIMESTAMP;
    }

    /**
     * Runs the zygote process's select loop. Accepts new connections as
     * they happen, and reads commands from connections one spawn-request's
@@ -416,10 +429,11 @@ class ZygoteServer {
        socketFDs.add(mZygoteSocket.getFileDescriptor());
        peers.add(null);

        long usapPoolRefillTriggerTimestamp = INVALID_TIMESTAMP;
        mUsapPoolRefillTriggerTimestamp = INVALID_TIMESTAMP;

        while (true) {
            fetchUsapPoolPolicyPropsWithMinInterval();
            mUsapPoolRefillAction = UsapPoolRefillAction.NONE;

            int[] usapPipeFDs = null;
            StructPollfd[] pollFDs;
@@ -473,11 +487,11 @@ class ZygoteServer {

            int pollTimeoutMs;

            if (usapPoolRefillTriggerTimestamp == INVALID_TIMESTAMP) {
            if (mUsapPoolRefillTriggerTimestamp == INVALID_TIMESTAMP) {
                pollTimeoutMs = -1;
            } else {
                int elapsedTimeMs =
                        (int) (System.currentTimeMillis() - usapPoolRefillTriggerTimestamp);
                        (int) (System.currentTimeMillis() - mUsapPoolRefillTriggerTimestamp);

                if (elapsedTimeMs >= mUsapPoolRefillDelayMs) {
                    // Normalize the poll timeout value when the time between one poll event and the
@@ -496,13 +510,12 @@ class ZygoteServer {
                throw new RuntimeException("poll failed", ex);
            }

            UsapPoolRefillAction usapPoolRefillAction = UsapPoolRefillAction.NONE;
            if (pollReturnValue == 0) {
                // The poll timeout has been exceeded.  This only occurs when we have finished the
                // USAP pool refill delay period.

                usapPoolRefillTriggerTimestamp = INVALID_TIMESTAMP;
                usapPoolRefillAction = UsapPoolRefillAction.DELAYED;
                mUsapPoolRefillTriggerTimestamp = INVALID_TIMESTAMP;
                mUsapPoolRefillAction = UsapPoolRefillAction.DELAYED;

            } else {
                boolean usapPoolFDRead = false;
@@ -632,15 +645,15 @@ class ZygoteServer {

                    if (usapPoolCount < mUsapPoolSizeMin) {
                        // Immediate refill
                        usapPoolRefillAction = UsapPoolRefillAction.IMMEDIATE;
                        mUsapPoolRefillAction = UsapPoolRefillAction.IMMEDIATE;
                    } else if (mUsapPoolSizeMax - usapPoolCount >= mUsapPoolRefillThreshold) {
                        // Delayed refill
                        usapPoolRefillTriggerTimestamp = System.currentTimeMillis();
                        mUsapPoolRefillTriggerTimestamp = System.currentTimeMillis();
                    }
                }
            }

            if (usapPoolRefillAction != UsapPoolRefillAction.NONE) {
            if (mUsapPoolRefillAction != UsapPoolRefillAction.NONE) {
                int[] sessionSocketRawFDs =
                        socketFDs.subList(1, socketFDs.size())
                                .stream()
@@ -648,7 +661,7 @@ class ZygoteServer {
                                .toArray();

                final boolean isPriorityRefill =
                        usapPoolRefillAction == UsapPoolRefillAction.IMMEDIATE;
                        mUsapPoolRefillAction == UsapPoolRefillAction.IMMEDIATE;

                final Runnable command =
                        fillUsapPool(sessionSocketRawFDs, isPriorityRefill);
@@ -657,7 +670,7 @@ class ZygoteServer {
                    return command;
                } else if (isPriorityRefill) {
                    // Schedule a delayed refill to finish refilling the pool.
                    usapPoolRefillTriggerTimestamp = System.currentTimeMillis();
                    mUsapPoolRefillTriggerTimestamp = System.currentTimeMillis();
                }
            }
        }