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

Commit 52ef1bf8 authored by lumark's avatar lumark
Browse files

Fix system circular wait during top display focus change

ag/5312657 introduced reporting top focus display change mechanism to ViewRootImpl
for IME window re-focus on top display.

When current focus on external display, system dialog popup on default display,
and then dismiss system dialog, System will possible got circular waiting
for ViewRootImpl lock <-> WMS global lock during reporting top display focus
change to ViewRootImpl & system dialog doing removeWindow for dismissal.

Let WindowState.reportFocusChangedSerialized out of WMS global lock
to fix the case.

Bug: 119658889
Test: manual to verify the issue case can pass
Test: atest ActivityManagerMultiDisplayTests

Change-Id: Ia30a279441def501e53eeee8913d19ac50a620cd
parent 92052f6f
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -4402,6 +4402,7 @@ public class WindowManagerService extends IWindowManager.Stub

                        lastFocus = displayContent.mLastFocus;
                        newFocus = displayContent.mCurrentFocus;
                    }
                    if (lastFocus == newFocus) {
                        // Report focus to ViewRootImpl when top focused display changes.
                        // Or, nothing to do for no window focus change.
@@ -4418,6 +4419,7 @@ public class WindowManagerService extends IWindowManager.Stub
                        }
                        return;
                    }
                    synchronized (mGlobalLock) {
                        displayContent.mLastFocus = newFocus;
                        if (DEBUG_FOCUS_LIGHT) Slog.i(TAG_WM, "Focus moving from " + lastFocus +
                                " to " + newFocus + " displayId=" + displayContent.getDisplayId());