diff options
| author | 2022-05-05 00:34:33 +0000 | |
|---|---|---|
| committer | 2022-05-05 00:34:33 +0000 | |
| commit | 1b4735ab6e7fe0a39e0189ab95804b9c8ff89bf0 (patch) | |
| tree | 5d51815b39d7211fffa26c17ae3720cc6053057e | |
| parent | 6a4d2e410ba1d73bdbf69161af117ad8e670c4b6 (diff) | |
| parent | 1187757cf264069a1258f464cfb1f919a6c844d4 (diff) | |
Merge "Prevent deadlock when releasing VirtualDisplays" into tm-dev am: 1187757cf2
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17658628
Change-Id: I168e64131c95a30373916825617f69803873280b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | services/core/java/com/android/server/display/DisplayManagerService.java | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index f3d41c4003c3..2cf11c657aa0 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1440,16 +1440,6 @@ public final class DisplayManagerService extends SystemService { DisplayDevice device = mVirtualDisplayAdapter.releaseVirtualDisplayLocked(appToken); if (device != null) { - final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(device); - if (display != null) { - final int displayId = display.getDisplayIdLocked(); - if (mDisplayWindowPolicyControllers.contains(displayId)) { - Pair<IVirtualDevice, DisplayWindowPolicyController> pair = - mDisplayWindowPolicyControllers.removeReturnOld(displayId); - getLocalService(VirtualDeviceManagerInternal.class) - .onVirtualDisplayRemoved(pair.first, displayId); - } - } // TODO: multi-display - handle virtual displays the same as other display adapters. mDisplayDeviceRepo.onDisplayDeviceEvent(device, DisplayAdapter.DISPLAY_DEVICE_EVENT_REMOVED); @@ -1609,6 +1599,17 @@ public final class DisplayManagerService extends SystemService { DisplayManagerGlobal.invalidateLocalDisplayInfoCaches(); sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_REMOVED); scheduleTraversalLocked(false); + + if (mDisplayWindowPolicyControllers.contains(displayId)) { + final IVirtualDevice virtualDevice = mDisplayWindowPolicyControllers.removeReturnOld( + displayId).first; + if (virtualDevice != null) { + mHandler.post(() -> { + getLocalService(VirtualDeviceManagerInternal.class) + .onVirtualDisplayRemoved(virtualDevice, displayId); + }); + } + } } private void handleLogicalDisplaySwappedLocked(@NonNull LogicalDisplay display) { |