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

Commit aa70502f authored by Evan Rosky's avatar Evan Rosky
Browse files

Remove queued before abort during failsafe flush

It may be possible that a legacy sync's abort runs
logic that can allow other logic to run which may read
from mQueuedTransitions before we actually clear it.
So, to be safe, clear the queue first.

Also, add some more checks for isFlushing to ensure we
aren't accidentally adding to the queue or collection
during the flush.

Bug: 439829314
Test: Existing tests
Flag: EXEMPT bugfix
Change-Id: I82d5cb20d843184c40b6acf98d2167fef0880893
parent 7c39c885
Loading
Loading
Loading
Loading
+18 −7
Original line number Diff line number Diff line
@@ -277,6 +277,10 @@ class TransitionController {
        mSyncEngine.addOnIdleListener(this::tryStartCollectFromQueue);
    }

    private boolean isFlushing() {
        return mTransitionPlayers.isEmpty();
    }

    void flushRunningTransitions() {
        // Temporarily clear so that nothing gets started/queued while flushing
        final ArrayList<TransitionPlayerRecord> temp = new ArrayList<>(mTransitionPlayers);
@@ -296,8 +300,10 @@ class TransitionController {
            mCollectingTransition.abort();
        }
        mRemotePlayer.clear();
        for (int i = 0; i < mQueuedTransitions.size(); ++i) {
            final QueuedTransition queued = mQueuedTransitions.get(i);
        final ArrayList<QueuedTransition> queuedTransits = new ArrayList<>(mQueuedTransitions);
        mQueuedTransitions.clear();
        for (int i = 0; i < queuedTransits.size(); ++i) {
            final QueuedTransition queued = queuedTransits.get(i);
            if (queued.mTransition != null) {
                queued.mTransition.abort();
            } else {
@@ -305,7 +311,6 @@ class TransitionController {
                mSyncEngine.abort(queued.mLegacySync.mSyncId);
            }
        }
        mQueuedTransitions.clear();
        mRunningLock.doNotifyLocked();
        // Restore the rest of the player stack
        mTransitionPlayers.addAll(temp);
@@ -343,8 +348,7 @@ class TransitionController {
        if (mCollectingTransition != null) {
            throw new IllegalStateException("Simultaneous transition collection not supported.");
        }
        if (mTransitionPlayers.isEmpty()) {
            // This means transitions are being "flushed" due to switching players.
        if (isFlushing()) {
            transition.abort();
            return;
        }
@@ -1193,7 +1197,7 @@ class TransitionController {
    }

    void tryStartCollectFromQueue() {
        if (!isShellTransitionsEnabled()) return;
        if (isFlushing()) return;
        if (mQueuedTransitions.isEmpty()) return;
        // Only need to try the next one since, even when transition can collect in parallel,
        // they still need to serialize on readiness.
@@ -1246,6 +1250,9 @@ class TransitionController {
    }

    void moveToPlaying(Transition transition) {
        if (isFlushing()) {
            Slog.wtfStack(TAG, "Starting to play a transition while flushing");
        }
        if (transition == mCollectingTransition) {
            mCollectingTransition = null;
            if (!mWaitingTransitions.isEmpty()) {
@@ -1614,6 +1621,10 @@ class TransitionController {
     */
    boolean startCollectOrQueue(Transition transit, OnStartCollect onStartCollect,
            boolean noopIfDuringDisplayChange) {
        if (isFlushing()) {
            transit.abort();
            return true;
        }
        if (!mQueuedTransitions.isEmpty()) {
            // Just add to queue since we already have a queue.
            queueTransition(transit, onStartCollect, noopIfDuringDisplayChange);
@@ -1651,7 +1662,7 @@ class TransitionController {
     */
    @Nullable
    Transition createAndStartCollecting(int type) {
        if (mTransitionPlayers.isEmpty()) {
        if (isFlushing()) {
            if (Flags.fallbackTransitionPlayer()) {
                throw new IllegalStateException("Can't create transition while flushing");
            }