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:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user