summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2022-05-05 00:34:33 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2022-05-05 00:34:33 +0000
commit1b4735ab6e7fe0a39e0189ab95804b9c8ff89bf0 (patch)
tree5d51815b39d7211fffa26c17ae3720cc6053057e
parent6a4d2e410ba1d73bdbf69161af117ad8e670c4b6 (diff)
parent1187757cf264069a1258f464cfb1f919a6c844d4 (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.java21
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) {