From 011e10f27552506789edc0361514bb92cb5a1fd6 Mon Sep 17 00:00:00 2001 From: ot903107 Date: Tue, 30 Nov 2021 17:34:52 +0800 Subject: [PATCH] Fix StageCoordinator unexpected onDisplayAreaVanished Seems already call Binder unlinkToDeath while registerOrganizer but still received binderDied in DAOC, dead organizer already been replaced by newer organizer with same featureId and will remove the newer organizer. Add a judge to make sure same organizer obecjt and old organizer binder isn't alive while DAOC received binderDied. Bug: 208552581 Test: run autotest pass Change-Id: I555d2fdedb7be7b7d0e5b10fbc617a9cce66c4b5 --- .../server/wm/DisplayAreaOrganizerController.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java index f61cc94b61810..a83a033985c5d 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +++ b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java @@ -65,7 +65,16 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl @Override public void binderDied() { synchronized (mGlobalLock) { - mOrganizersByFeatureIds.remove(mFeature).destroy(); + IDisplayAreaOrganizer featureOrganizer = getOrganizerByFeature(mFeature); + if (featureOrganizer != null) { + IBinder organizerBinder = featureOrganizer.asBinder(); + if (!organizerBinder.equals(mOrganizer.asBinder()) && + organizerBinder.isBinderAlive()) { + Slog.d(TAG, "Dead organizer replaced for feature=" + mFeature); + return; + } + mOrganizersByFeatureIds.remove(mFeature).destroy(); + } } } } @@ -172,7 +181,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl organizer.asBinder(), uid); mOrganizersByFeatureIds.entrySet().removeIf((entry) -> { final boolean matches = entry.getValue().mOrganizer.asBinder() - == organizer.asBinder(); + .equals(organizer.asBinder()); if (matches) { entry.getValue().destroy(); }