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

Commit 22ee9aad authored by Craig Mautner's avatar Craig Mautner Committed by Android (Google) Code Review
Browse files

Merge "Reset and reuse Iterators and don't new() one."

parents 0786207b 343ad71d
Loading
Loading
Loading
Loading
+31 −7
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.server.wm;

import static com.android.server.wm.WindowManagerService.FORWARD_ITERATOR;
import static com.android.server.wm.WindowManagerService.REVERSE_ITERATOR;

import android.util.SparseArray;
import android.view.Display;
import android.view.DisplayInfo;
@@ -88,6 +91,8 @@ class DisplayContent {
    ArrayList<TaskList> mTaskLists = new ArrayList<TaskList>();
    SparseArray<TaskList> mTaskIdToTaskList = new SparseArray<TaskList>();

    private final AppTokenIterator mTmpAppIterator = new AppTokenIterator();

    /**
     * @param display May not be null.
     */
@@ -169,6 +174,18 @@ class DisplayContent {
        wtoken.groupId = newTaskId;
    }

    /**
     * Return the utility iterator so we don't have to construct new iterators every time we
     * iterate.
     * NOTE: Do not ever nest this call or you will have a bad time!
     * @param reverse Direction of iterator.
     * @return The utility iterator.
     */
    AppTokenIterator getTmpAppIterator(boolean reverse) {
        mTmpAppIterator.reset(reverse);
        return mTmpAppIterator;
    }

    class TaskListsIterator implements Iterator<TaskList> {
        private int mCur;
        private boolean mReverse;
@@ -178,9 +195,12 @@ class DisplayContent {
        }

        TaskListsIterator(boolean reverse) {
            reset(reverse);
        }

        void reset(boolean reverse) {
            mReverse = reverse;
            int numTaskLists = mTaskLists.size();
            mCur = reverse ? numTaskLists - 1 : 0;
            mCur = reverse ? mTaskLists.size() - 1 : 0;
        }

        @Override
@@ -208,18 +228,22 @@ class DisplayContent {
    }

    class AppTokenIterator implements Iterator<AppWindowToken> {
        final TaskListsIterator mIterator;
        final boolean mReverse;
        final TaskListsIterator mIterator = new TaskListsIterator();
        boolean mReverse;
        int mCur;
        TaskList mTaskList;

        public AppTokenIterator() {
            this(false);
            this(FORWARD_ITERATOR);
        }

        public AppTokenIterator(boolean reverse) {
            reset(reverse);
        }

        void reset(boolean reverse) {
            mReverse = reverse;
            mIterator = new TaskListsIterator(reverse);
            mIterator.reset(reverse);
            getNextTaskList();
        }

@@ -292,7 +316,7 @@ class DisplayContent {
            pw.print("x"); pw.print(mDisplayInfo.smallestNominalAppHeight);
            pw.print("-"); pw.print(mDisplayInfo.largestNominalAppWidth);
            pw.print("x"); pw.println(mDisplayInfo.largestNominalAppHeight);
            AppTokenIterator iterator = new AppTokenIterator(true);
            AppTokenIterator iterator = getTmpAppIterator(REVERSE_ITERATOR);
            int ndx = iterator.size() - 1;
            if (ndx >= 0) {
                pw.println();
+5 −3
Original line number Diff line number Diff line
@@ -10,6 +10,8 @@ import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPA
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED;
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE;
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_ACTION_PENDING;
import static com.android.server.wm.WindowManagerService.FORWARD_ITERATOR;
import static com.android.server.wm.WindowManagerService.REVERSE_ITERATOR;

import android.content.Context;
import android.os.Debug;
@@ -176,7 +178,7 @@ public class WindowAnimator {
    private void updateAppWindowsLocked(int displayId) {
        int i;
        final DisplayContent displayContent = mService.getDisplayContentLocked(displayId);
        AppTokenIterator iterator = displayContent.new AppTokenIterator();
        AppTokenIterator iterator = displayContent.getTmpAppIterator(FORWARD_ITERATOR);
        while (iterator.hasNext()) {
            final AppWindowAnimator appAnimator = iterator.next().mAppAnimator;
            final boolean wasAnimating = appAnimator.animation != null
@@ -459,8 +461,8 @@ public class WindowAnimator {
    private void testTokenMayBeDrawnLocked(int displayId) {
        // See if any windows have been drawn, so they (and others
        // associated with them) can now be shown.
        AppTokenIterator iterator = mService.getDisplayContentLocked(displayId).new
                AppTokenIterator();
        AppTokenIterator iterator =
                mService.getDisplayContentLocked(displayId).getTmpAppIterator(FORWARD_ITERATOR);
        while (iterator.hasNext()) {
            AppWindowToken wtoken = iterator.next();
            AppWindowAnimator appAnimator = wtoken.mAppAnimator;
+113 −89
Original line number Diff line number Diff line
@@ -208,6 +208,9 @@ public class WindowManagerService extends IWindowManager.Stub
    static final boolean PROFILE_ORIENTATION = false;
    static final boolean localLOGV = DEBUG;

    final static boolean REVERSE_ITERATOR = true;
    final static boolean FORWARD_ITERATOR = false;

    /** How much to multiply the policy's type layer, to reserve room
     * for multiple windows of the same type and Z-ordering adjustment
     * with TYPE_LAYER_OFFSET. */
@@ -422,6 +425,8 @@ public class WindowManagerService extends IWindowManager.Stub
    private SparseArray<DisplayContent> mTaskIdToDisplayContents =
            new SparseArray<DisplayContent>();

    private final AllWindowsIterator mTmpWindowsIterator = new AllWindowsIterator();

    int mRotation = 0;
    int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
    boolean mAltOrientation = false;
@@ -939,8 +944,7 @@ public class WindowManagerService extends IWindowManager.Stub
                    // Figure out where the window should go, based on the
                    // order of applications.
                    WindowState pos = null;
                    AppTokenIterator iterator =
                            displayContent.new AppTokenIterator(true /*reverse*/);
                    AppTokenIterator iterator = displayContent.getTmpAppIterator(REVERSE_ITERATOR);
                    while (iterator.hasNext()) {
                        AppWindowToken t = iterator.next();
                        if (t == token) {
@@ -2453,9 +2457,9 @@ public class WindowManagerService extends IWindowManager.Stub

    public void updateAppOpsState() {
        synchronized(mWindowMap) {
            AllWindowsIterator iterator = new AllWindowsIterator();
            while (iterator.hasNext()) {
                final WindowState win = iterator.next();
            mTmpWindowsIterator.reset(FORWARD_ITERATOR);
            while (mTmpWindowsIterator.hasNext()) {
                final WindowState win = mTmpWindowsIterator.next();
                if (win.mAppOp != AppOpsManager.OP_NONE) {
                    final int mode = mAppOps.checkOpNoThrow(win.mAppOp, win.getOwningUid(),
                            win.getOwningPackage());
@@ -3101,6 +3105,7 @@ public class WindowManagerService extends IWindowManager.Stub
    // -------------------------------------------------------------

    public void validateAppTokens(List<TaskGroup> tasks) {
        synchronized (mWindowMap) {
            int t = tasks.size() - 1;
            if (t < 0) {
                Slog.w(TAG, "validateAppTokens: empty task list");
@@ -3115,7 +3120,7 @@ public class WindowManagerService extends IWindowManager.Stub
                return;
            }

        AppTokenIterator iterator = displayContent.new AppTokenIterator(true);
            AppTokenIterator iterator = displayContent.getTmpAppIterator(REVERSE_ITERATOR);
            for ( ; t >= 0; --t) {
                task = tasks.get(t);
                List<IApplicationToken> tokens = task.tokens;
@@ -3152,6 +3157,7 @@ public class WindowManagerService extends IWindowManager.Stub
                }
            }
        }
    }

    boolean checkCallingPermission(String permission, String func) {
        // Quick check: if the calling permission is me, it's all okay.
@@ -3380,7 +3386,7 @@ public class WindowManagerService extends IWindowManager.Stub
        boolean lastFullscreen = false;
        // TODO: Multi window.
        DisplayContent displayContent = getDefaultDisplayContentLocked();
        AppTokenIterator iterator = displayContent.new AppTokenIterator(true);
        AppTokenIterator iterator = displayContent.getTmpAppIterator(REVERSE_ITERATOR);
        while (iterator.hasNext()) {
            AppWindowToken atoken = iterator.next();

@@ -4362,7 +4368,7 @@ public class WindowManagerService extends IWindowManager.Stub
        while (iterator.hasNext()) {
            DisplayContent displayContent = iterator.next();
            Slog.v(TAG, "  Display " + displayContent.getDisplayId());
            AppTokenIterator appIterator = displayContent.new AppTokenIterator(true);
            AppTokenIterator appIterator = displayContent.getTmpAppIterator(REVERSE_ITERATOR);
            int i = appIterator.size();
            while (appIterator.hasNext()) {
                Slog.v(TAG, "  #" + --i + ": " + appIterator.next().token);
@@ -4372,9 +4378,9 @@ public class WindowManagerService extends IWindowManager.Stub

    void dumpWindowsLocked() {
        int i = 0;
        final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR);
        while (iterator.hasNext()) {
            final WindowState w = iterator.next();
        mTmpWindowsIterator.reset(REVERSE_ITERATOR);
        while (mTmpWindowsIterator.hasNext()) {
            final WindowState w = mTmpWindowsIterator.next();
            Slog.v(TAG, "  #" + i++ + ": " + w);
        }
    }
@@ -4389,7 +4395,7 @@ public class WindowManagerService extends IWindowManager.Stub
        final WindowList windows = displayContent.getWindowList();
        final int NW = windows.size();

        AppTokenIterator iterator = displayContent.new AppTokenIterator(true);
        AppTokenIterator iterator = displayContent.getTmpAppIterator(REVERSE_ITERATOR);
        while (iterator.hasNext()) {
            if (iterator.next() == target) {
                break;
@@ -4692,9 +4698,9 @@ public class WindowManagerService extends IWindowManager.Stub
    @Override
    public void closeSystemDialogs(String reason) {
        synchronized(mWindowMap) {
            final AllWindowsIterator iterator = new AllWindowsIterator();
            while (iterator.hasNext()) {
                final WindowState w = iterator.next();
            mTmpWindowsIterator.reset(FORWARD_ITERATOR);
            while (mTmpWindowsIterator.hasNext()) {
                final WindowState w = mTmpWindowsIterator.next();
                if (w.mHasSurface) {
                    try {
                        w.mClient.closeSystemDialogs(reason);
@@ -5088,9 +5094,9 @@ public class WindowManagerService extends IWindowManager.Stub
            // the background..)
            if (on) {
                boolean isVisible = false;
                final AllWindowsIterator iterator = new AllWindowsIterator();
                while (iterator.hasNext()) {
                    final WindowState ws = iterator.next();
                mTmpWindowsIterator.reset(FORWARD_ITERATOR);
                while (mTmpWindowsIterator.hasNext()) {
                    final WindowState ws = mTmpWindowsIterator.next();
                    if (ws.mSession.mPid == pid && ws.isVisibleLw()) {
                        isVisible = true;
                        break;
@@ -5966,9 +5972,9 @@ public class WindowManagerService extends IWindowManager.Stub
        }

        synchronized (mWindowMap) {
            final AllWindowsIterator iterator = new AllWindowsIterator();
            while (iterator.hasNext()) {
                final WindowState w = iterator.next();
            mTmpWindowsIterator.reset(FORWARD_ITERATOR);
            while (mTmpWindowsIterator.hasNext()) {
                final WindowState w = mTmpWindowsIterator.next();
                if (System.identityHashCode(w) == hashCode) {
                    return w;
                }
@@ -6517,10 +6523,10 @@ public class WindowManagerService extends IWindowManager.Stub
    // TODO(multidisplay): Call isScreenOn for each display.
    private void sendScreenStatusToClientsLocked() {
        final boolean on = mPowerManager.isScreenOn();
        final AllWindowsIterator iterator = new AllWindowsIterator();
        while (iterator.hasNext()) {
        mTmpWindowsIterator.reset(FORWARD_ITERATOR);
        while (mTmpWindowsIterator.hasNext()) {
            try {
                iterator.next().mClient.dispatchScreenState(on);
                mTmpWindowsIterator.next().mClient.dispatchScreenState(on);
            } catch (RemoteException e) {
                // Ignored
            }
@@ -6861,7 +6867,8 @@ public class WindowManagerService extends IWindowManager.Stub
                    synchronized (mWindowMap) {
                        Slog.w(TAG, "App freeze timeout expired.");
                        DisplayContent displayContent = getDefaultDisplayContentLocked();
                        AppTokenIterator iterator = displayContent.new AppTokenIterator(true);
                        AppTokenIterator iterator =
                                displayContent.getTmpAppIterator(REVERSE_ITERATOR);
                        while (iterator.hasNext()) {
                            AppWindowToken tok = iterator.next();
                            if (tok.mAppAnimator.freezingScreen) {
@@ -7324,7 +7331,7 @@ public class WindowManagerService extends IWindowManager.Stub
        }

        // And add in the still active app tokens in Z order.
        AppTokenIterator iterator = displayContent.new AppTokenIterator();
        AppTokenIterator iterator = displayContent.getTmpAppIterator(FORWARD_ITERATOR);
        while (iterator.hasNext()) {
            i = reAddAppWindowsLocked(displayContent, i, iterator.next());
        }
@@ -7997,7 +8004,7 @@ public class WindowManagerService extends IWindowManager.Stub
        mAppTransition.setIdle();
        // Restore window app tokens to the ActivityManager views
        final DisplayContent displayContent = getDefaultDisplayContentLocked();
        AppTokenIterator iterator = displayContent.new AppTokenIterator();
        AppTokenIterator iterator = displayContent.getTmpAppIterator(FORWARD_ITERATOR);
        while (iterator.hasNext()) {
            iterator.next().sendingToBottom = false;
        }
@@ -8157,7 +8164,7 @@ public class WindowManagerService extends IWindowManager.Stub
    private void updateAllDrawnLocked(DisplayContent displayContent) {
        // See if any windows have been drawn, so they (and others
        // associated with them) can now be shown.
        AppTokenIterator iterator = displayContent.new AppTokenIterator();
        AppTokenIterator iterator = displayContent.getTmpAppIterator(FORWARD_ITERATOR);
        while (iterator.hasNext()) {
            AppWindowToken wtoken = iterator.next();
            if (!wtoken.allDrawn) {
@@ -8924,10 +8931,10 @@ public class WindowManagerService extends IWindowManager.Stub
            // window list to make sure we haven't left any dangling surfaces
            // around.

            AllWindowsIterator iterator = new AllWindowsIterator();
            mTmpWindowsIterator.reset(FORWARD_ITERATOR);
            Slog.i(TAG, "Out of memory for surface!  Looking for leaks...");
            while (iterator.hasNext()) {
                WindowState ws = iterator.next();
            while (mTmpWindowsIterator.hasNext()) {
                WindowState ws = mTmpWindowsIterator.next();
                WindowStateAnimator wsa = ws.mWinAnimator;
                if (wsa.mSurface != null) {
                    if (!mSessions.contains(wsa.mSession)) {
@@ -8960,9 +8967,9 @@ public class WindowManagerService extends IWindowManager.Stub
            if (!leakedSurface) {
                Slog.w(TAG, "No leaked surfaces; killing applicatons!");
                SparseIntArray pidCandidates = new SparseIntArray();
                iterator = new AllWindowsIterator();
                while (iterator.hasNext()) {
                    WindowState ws = iterator.next();
                mTmpWindowsIterator.reset(FORWARD_ITERATOR);
                while (mTmpWindowsIterator.hasNext()) {
                    WindowState ws = mTmpWindowsIterator.next();
                    if (mForceRemoves.contains(ws)) {
                        continue;
                    }
@@ -9088,7 +9095,7 @@ public class WindowManagerService extends IWindowManager.Stub
    }

    private WindowState findFocusedWindowLocked(DisplayContent displayContent) {
        AppTokenIterator iterator = displayContent.new AppTokenIterator(true);
        AppTokenIterator iterator = displayContent.getTmpAppIterator(REVERSE_ITERATOR);
        WindowToken nextApp = iterator.hasNext() ? iterator.next() : null;

        final WindowList windows = displayContent.getWindowList();
@@ -9552,9 +9559,9 @@ public class WindowManagerService extends IWindowManager.Stub
    void dumpWindowsNoHeaderLocked(PrintWriter pw, boolean dumpAll,
            ArrayList<WindowState> windows) {
        int j = 0;
        final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR);
        while (iterator.hasNext()) {
            final WindowState w = iterator.next();
        mTmpWindowsIterator.reset(REVERSE_ITERATOR);
        while (mTmpWindowsIterator.hasNext()) {
            final WindowState w = mTmpWindowsIterator.next();
            if (windows == null || windows.contains(w)) {
                pw.print("  Window #"); pw.print(j++); pw.print(' ');
                        pw.print(w); pw.println(":");
@@ -9749,9 +9756,9 @@ public class WindowManagerService extends IWindowManager.Stub
        WindowList windows = new WindowList();
        if ("visible".equals(name)) {
            synchronized(mWindowMap) {
                final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR);
                while (iterator.hasNext()) {
                    final WindowState w = iterator.next();
                mTmpWindowsIterator.reset(REVERSE_ITERATOR);
                while (mTmpWindowsIterator.hasNext()) {
                    final WindowState w = mTmpWindowsIterator.next();
                    if (w.mWinAnimator.mSurfaceShown) {
                        windows.add(w);
                    }
@@ -9766,9 +9773,9 @@ public class WindowManagerService extends IWindowManager.Stub
            } catch (RuntimeException e) {
            }
            synchronized(mWindowMap) {
                final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR);
                while (iterator.hasNext()) {
                    final WindowState w = iterator.next();
                mTmpWindowsIterator.reset(REVERSE_ITERATOR);
                while (mTmpWindowsIterator.hasNext()) {
                    final WindowState w = mTmpWindowsIterator.next();
                    if (name != null) {
                        if (w.mAttrs.getTitle().toString().contains(name)) {
                            windows.add(w);
@@ -9995,6 +10002,10 @@ public class WindowManagerService extends IWindowManager.Stub
    class DisplayContentsIterator implements Iterator<DisplayContent> {
        private int cur;

        void reset() {
            cur = 0;
        }

        @Override
        public boolean hasNext() {
            return cur < mDisplayContents.size();
@@ -10014,7 +10025,6 @@ public class WindowManagerService extends IWindowManager.Stub
        }
    }

    final static boolean REVERSE_ITERATOR = true;
    class AllWindowsIterator implements Iterator<WindowState> {
        private DisplayContent mDisplayContent;
        private DisplayContentsIterator mDisplayContentsIterator;
@@ -10023,19 +10033,33 @@ public class WindowManagerService extends IWindowManager.Stub
        private boolean mReverse;

        AllWindowsIterator() {
            mDisplayContentsIterator = new DisplayContentsIterator();
            mDisplayContent = mDisplayContentsIterator.next();
            mWindowList = mDisplayContent.getWindowList();
            this(false);
        }

        AllWindowsIterator(boolean reverse) {
            this();
            mDisplayContentsIterator = new DisplayContentsIterator();
            reset(reverse);
        }

        void reset(boolean reverse) {
            mReverse = reverse;
            mDisplayContentsIterator.reset();
            if (mDisplayContentsIterator.hasNext()) {
                mDisplayContent = mDisplayContentsIterator.next();
                mWindowList = mDisplayContent.getWindowList();
                mWindowListIndex = reverse ? mWindowList.size() - 1 : 0;
            } else {
                mDisplayContent = null;
                mWindowList = null;
                mWindowListIndex = 0;
            }
        }

        @Override
        public boolean hasNext() {
            if (mDisplayContent == null) {
                return false;
            }
            if (mReverse) {
                return mWindowListIndex >= 0;
            }