Skip to content

Commit 4fceea9

Browse files
Qiushi.HanGenkzsz11
authored andcommitted
wm: Passing a new ArraySet instance to avoid crash
The two threads "LazyTaskWriterThread" and "TaskSnapshotPersister" are using the same persistentTaskIds param, which can lead to crash as follows E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: TaskSnapshotPersister E AndroidRuntime: java.lang.ArrayIndexOutOfBoundsException: length=0; index=14 E AndroidRuntime: at android.util.ContainerHelpers.binarySearch(ContainerHelpers.java:28) E AndroidRuntime: at android.util.ArraySet.indexOf(ArraySet.java:86) E AndroidRuntime: at android.util.ArraySet.indexOf(ArraySet.java:341) E AndroidRuntime: at android.util.ArraySet.contains(ArraySet.java:330) E AndroidRuntime: at com.android.server.wm.TaskSnapshotPersister$RemoveObsoleteFilesQueueItem.write(TaskSnapshotPersister.java:388) E AndroidRuntime: at com.android.server.wm.TaskSnapshotPersister$1.run(TaskSnapshotPersister.java:226) To fix this, passing a new ArraySet instance instead. Change-Id: Id9503ae93ea929e7a289bd0a9f461f0639983ea6
1 parent d8b31f8 commit 4fceea9

1 file changed

Lines changed: 3 additions & 1 deletion

File tree

services/core/java/com/android/server/wm/TaskSnapshotPersister.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,9 @@ void onTaskRemovedFromRecents(int taskId, int userId) {
162162
void removeObsoleteFiles(ArraySet<Integer> persistentTaskIds, int[] runningUserIds) {
163163
synchronized (mLock) {
164164
mPersistedTaskIdsSinceLastRemoveObsolete.clear();
165-
sendToQueueLocked(new RemoveObsoleteFilesQueueItem(persistentTaskIds, runningUserIds));
165+
// Copy persistentTaskIds to avoid two threads manipulating it at the same time.
166+
sendToQueueLocked(new RemoveObsoleteFilesQueueItem(
167+
new ArraySet<>(persistentTaskIds), runningUserIds));
166168
}
167169
}
168170

0 commit comments

Comments
 (0)