From c33648aae08de2962f4f652df7d853c97344d7fc Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Tue, 13 Apr 2021 15:14:14 +0800 Subject: [PATCH] Hold WM lock when add starting window to TaskOrganizer WM lock will be needed when TaskOrgnaizerController#addStartingWindow and removeStartingWindow in case of race condition. Fixes: 185095280 Test: atest ActivityRecordTests Change-Id: Ifd8f2f09ec6238c906bcde812684a705620424a9 --- .../com/android/server/wm/ActivityRecord.java | 1 - .../server/wm/StartingSurfaceController.java | 28 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 631d86660dcf6..0c6df7e3032fe 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2137,7 +2137,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "Add starting %s: startingData=%s", this, startingData); - WindowManagerPolicy.StartingSurface surface = null; try { surface = startingData.createStartingSurface(ActivityRecord.this); diff --git a/services/core/java/com/android/server/wm/StartingSurfaceController.java b/services/core/java/com/android/server/wm/StartingSurfaceController.java index 140ae3e7d756d..603bfd1534818 100644 --- a/services/core/java/com/android/server/wm/StartingSurfaceController.java +++ b/services/core/java/com/android/server/wm/StartingSurfaceController.java @@ -58,10 +58,12 @@ public class StartingSurfaceController { overrideConfig, displayId); } - final Task task = activity.getTask(); - if (task != null && mService.mAtmService.mTaskOrganizerController.addStartingWindow(task, - activity.token, theme)) { - return new ShellStartingSurface(task); + synchronized (mService.mGlobalLock) { + final Task task = activity.getTask(); + if (task != null && mService.mAtmService.mTaskOrganizerController.addStartingWindow( + task, activity.token, theme)) { + return new ShellStartingSurface(task); + } } return null; } @@ -124,14 +126,13 @@ public class StartingSurfaceController { activity.mDisplayContent.handleTopActivityLaunchingInDifferentOrientation( topFullscreenActivity, false /* checkOpening */); } + if (DEBUG_ENABLE_SHELL_DRAWER) { + mService.mAtmService.mTaskOrganizerController.addStartingWindow(task, + activity.token, 0 /* launchTheme */); + return new ShellStartingSurface(task); + } } - if (!DEBUG_ENABLE_SHELL_DRAWER) { - return mService.mTaskSnapshotController - .createStartingSurface(activity, taskSnapshot); - } - mService.mAtmService.mTaskOrganizerController.addStartingWindow(task, activity.token, - 0 /* launchTheme */); - return new ShellStartingSurface(task); + return mService.mTaskSnapshotController.createStartingSurface(activity, taskSnapshot); } @@ -144,8 +145,9 @@ public class StartingSurfaceController { @Override public void remove(boolean animate) { - mService.mAtmService.mTaskOrganizerController.removeStartingWindow(mTask, - animate); + synchronized (mService.mGlobalLock) { + mService.mAtmService.mTaskOrganizerController.removeStartingWindow(mTask, animate); + } } } }