From 53d1e66080d004477da3a87f901b2e2d3db24775 Mon Sep 17 00:00:00 2001 From: tiger_huang Date: Tue, 23 Feb 2016 20:34:52 +0800 Subject: [PATCH] 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 --- .../android/server/wm/WindowManagerService.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 6d3d5d6daa600..68d6de4e1b01a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -11982,6 +11982,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void waitForAllWindowsDrawn(Runnable callback, long timeout) { + boolean allWindowsDrawn = false; synchronized (mWindowMap) { mWaitingForDrawnCallback = callback; final WindowList windows = getDefaultWindowListLocked(); @@ -12002,13 +12003,16 @@ public class WindowManagerService extends IWindowManager.Stub } } requestTraversalLocked(); + mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT); + if (mWaitingForDrawn.isEmpty()) { + allWindowsDrawn = true; + } else { + mH.sendEmptyMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, timeout); + checkDrawnWindowsLocked(); + } } - mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT); - if (mWaitingForDrawn.isEmpty()) { + if (allWindowsDrawn) { callback.run(); - } else { - mH.sendEmptyMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, timeout); - checkDrawnWindowsLocked(); } }