Fix purge bug for program list update
Fix the bug that using keySet and removing items of mPrograms at the same time during program list update Bug: 238199883 Test: atest android.hardware.radio.tests.functional Test: atest com.android.server.broadcastradio.hal2 Change-Id: Ie958b3686780de8c6f3b9912c71dcfe7c07befd0
This commit is contained in:
@@ -22,10 +22,11 @@ import android.annotation.Nullable;
|
|||||||
import android.annotation.SystemApi;
|
import android.annotation.SystemApi;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
import android.util.ArrayMap;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -41,7 +42,7 @@ public final class ProgramList implements AutoCloseable {
|
|||||||
|
|
||||||
private final Object mLock = new Object();
|
private final Object mLock = new Object();
|
||||||
private final Map<ProgramSelector.Identifier, RadioManager.ProgramInfo> mPrograms =
|
private final Map<ProgramSelector.Identifier, RadioManager.ProgramInfo> mPrograms =
|
||||||
new HashMap<>();
|
new ArrayMap<>();
|
||||||
|
|
||||||
private final List<ListCallback> mListCallbacks = new ArrayList<>();
|
private final List<ListCallback> mListCallbacks = new ArrayList<>();
|
||||||
private final List<OnCompleteListener> mOnCompleteListeners = new ArrayList<>();
|
private final List<OnCompleteListener> mOnCompleteListeners = new ArrayList<>();
|
||||||
@@ -184,8 +185,14 @@ public final class ProgramList implements AutoCloseable {
|
|||||||
listCallbacksCopied = new ArrayList<>(mListCallbacks);
|
listCallbacksCopied = new ArrayList<>(mListCallbacks);
|
||||||
|
|
||||||
if (chunk.isPurge()) {
|
if (chunk.isPurge()) {
|
||||||
for (ProgramSelector.Identifier id : mPrograms.keySet()) {
|
Iterator<Map.Entry<ProgramSelector.Identifier, RadioManager.ProgramInfo>>
|
||||||
removeLocked(id, removedList);
|
programsIterator = mPrograms.entrySet().iterator();
|
||||||
|
while (programsIterator.hasNext()) {
|
||||||
|
RadioManager.ProgramInfo removed = programsIterator.next().getValue();
|
||||||
|
if (removed != null) {
|
||||||
|
removedList.add(removed.getSelector().getPrimaryId());
|
||||||
|
}
|
||||||
|
programsIterator.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user