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
This commit is contained in:
ot903107
2021-11-30 17:34:52 +08:00
committed by Chuanghua Zhao
parent 6434804c00
commit 011e10f275

View File

@@ -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();
}