From f040934611473654a4abb5e44d3da97fbbc6d9c6 Mon Sep 17 00:00:00 2001 From: Jeff Chang Date: Tue, 27 Jul 2021 23:31:29 +0800 Subject: [PATCH] Fix the leak while remove the taskFragment ConcurrentModificationException is thrown from the ForEach function while dealing with the dead process. Task vanished event is sent when remove task fragments and it updates the organized taskFragments list at the same time. Bug: 194728551 Test: - Launch activity to split and adb shell am force-stop process Change-Id: I3a888def3337417565178407f13019f751bca017 --- .../android/server/wm/TaskFragmentOrganizerController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java index 4843e5a4dc084..a322384341014 100644 --- a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java @@ -116,8 +116,11 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr } void dispose() { - mOrganizedTaskFragments.forEach(TaskFragment::removeImmediately); - mOrganizedTaskFragments.clear(); + while (!mOrganizedTaskFragments.isEmpty()) { + final TaskFragment taskFragment = mOrganizedTaskFragments.get(0); + taskFragment.removeImmediately(); + mOrganizedTaskFragments.remove(taskFragment); + } mOrganizer.asBinder().unlinkToDeath(this, 0 /*flags*/); }