Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a573ea08 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Prevent deadlock when releasing VirtualDisplays" into tm-dev am:...

Merge "Prevent deadlock when releasing VirtualDisplays" into tm-dev am: 1187757c am: 1b4735ab am: 22f2f573 am: 1e32fd6f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17658628



Change-Id: If83edc58d7db10aa0bbb22fd34e537d4bbb36d26
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 12e76d2b 1e32fd6f
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -1435,16 +1435,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);
@@ -1601,6 +1591,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) {