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
This commit is contained in:
lumark
2018-11-16 21:24:51 +08:00
parent 92052f6f8e
commit 52ef1bf893

View File

@@ -4402,22 +4402,24 @@ 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.
if (topFocusedDisplayChanged && newFocus != null) {
if (DEBUG_FOCUS_LIGHT) {
Slog.d(TAG, "Reporting focus: " + newFocus
+ " due to top focused display change.");
}
// See {@link IWindow#windowFocusChanged} to know why set
// reportToClient as false.
newFocus.reportFocusChangedSerialized(true, mInTouchMode,
false /* reportToClient */);
notifyFocusChanged();
}
if (lastFocus == newFocus) {
// Report focus to ViewRootImpl when top focused display changes.
// Or, nothing to do for no window focus change.
if (topFocusedDisplayChanged && newFocus != null) {
if (DEBUG_FOCUS_LIGHT) {
Slog.d(TAG, "Reporting focus: " + newFocus
+ " due to top focused display change.");
}
return;
// See {@link IWindow#windowFocusChanged} to know why set
// reportToClient as false.
newFocus.reportFocusChangedSerialized(true, mInTouchMode,
false /* reportToClient */);
notifyFocusChanged();
}
return;
}
synchronized (mGlobalLock) {
displayContent.mLastFocus = newFocus;
if (DEBUG_FOCUS_LIGHT) Slog.i(TAG_WM, "Focus moving from " + lastFocus +
" to " + newFocus + " displayId=" + displayContent.getDisplayId());