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

Commit 53d1e660 authored by tiger_huang's avatar tiger_huang
Browse files

Make accessing mWaitingForDrawn thread-safe

mWaitingForDrawn can be accessed by multiple threads, but it was not
protected by the mWindowMap lock perfectly.

Change-Id: I128ba1a00f40af83b051c0d1df4350d0635a9dff
parent 5af6dd54
Loading
Loading
Loading
Loading
+9 −5
Original line number Original line Diff line number Diff line
@@ -11982,6 +11982,7 @@ public class WindowManagerService extends IWindowManager.Stub


        @Override
        @Override
        public void waitForAllWindowsDrawn(Runnable callback, long timeout) {
        public void waitForAllWindowsDrawn(Runnable callback, long timeout) {
            boolean allWindowsDrawn = false;
            synchronized (mWindowMap) {
            synchronized (mWindowMap) {
                mWaitingForDrawnCallback = callback;
                mWaitingForDrawnCallback = callback;
                final WindowList windows = getDefaultWindowListLocked();
                final WindowList windows = getDefaultWindowListLocked();
@@ -12002,15 +12003,18 @@ public class WindowManagerService extends IWindowManager.Stub
                    }
                    }
                }
                }
                requestTraversalLocked();
                requestTraversalLocked();
            }
                mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT);
                mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT);
                if (mWaitingForDrawn.isEmpty()) {
                if (mWaitingForDrawn.isEmpty()) {
                callback.run();
                    allWindowsDrawn = true;
                } else {
                } else {
                    mH.sendEmptyMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, timeout);
                    mH.sendEmptyMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, timeout);
                    checkDrawnWindowsLocked();
                    checkDrawnWindowsLocked();
                }
                }
            }
            }
            if (allWindowsDrawn) {
                callback.run();
            }
        }


        @Override
        @Override
        public void addWindowToken(IBinder token, int type) {
        public void addWindowToken(IBinder token, int type) {