From d79885346055a8b256823b76c68b62df51bca2e9 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Tue, 30 May 2017 15:29:19 -0700 Subject: [PATCH] Added missing lock and clean up locked function that wasn't locked There was a missing lock that systemui would call to register a docked stack listener. Since it was missing, it is assumed that two threads went into a race condition which caused it to crash when handling begin before finish broadcasts for the same DockedStackDividerController. Also moved getDefaultDisplayContentLocked call that was not locked to a locked area. Change-Id: I3c7ef805024aaf0f5f7c4ab68fc779797114a038 Fixes: 62104210 Test: go/wm-smoke --- .../server/wm/WindowManagerService.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a15891bc64140..624856113e058 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3816,20 +3816,22 @@ public class WindowManagerService extends IWindowManager.Stub long origId = Binder.clearCallingIdentity(); try { - final boolean rotationChanged; // TODO(multi-display): Update rotation for different displays separately. - final DisplayContent displayContent = getDefaultDisplayContentLocked(); + final boolean rotationChanged; + final int displayId; synchronized (mWindowMap) { + final DisplayContent displayContent = getDefaultDisplayContentLocked(); rotationChanged = displayContent.updateRotationUnchecked( false /* inTransaction */); if (!rotationChanged || forceRelayout) { - getDefaultDisplayContentLocked().setLayoutNeeded(); + displayContent.setLayoutNeeded(); mWindowPlacerLocked.performSurfacePlacement(); } + displayId = displayContent.getDisplayId(); } if (rotationChanged || alwaysSendConfiguration) { - sendNewConfiguration(displayContent.getDisplayId()); + sendNewConfiguration(displayId); } } finally { Binder.restoreCallingIdentity(origId); @@ -6890,9 +6892,11 @@ public class WindowManagerService extends IWindowManager.Stub "registerDockedStackListener()")) { return; } - // TODO(multi-display): The listener is registered on the default display only. - getDefaultDisplayContentLocked().mDividerControllerLocked.registerDockedStackListener( - listener); + synchronized (mWindowMap) { + // TODO(multi-display): The listener is registered on the default display only. + getDefaultDisplayContentLocked().mDividerControllerLocked.registerDockedStackListener( + listener); + } } @Override