Return a copy of the "real" set in AssociationStore
Return a copy of the "real" set AssociationSet from
AssociationStoreImpl.getAssociations(), which fixes
ConcurrentModificationException-s that arise if a direct reference to
the mIdMap.values() collection is returned.
Bug: 220018043
Test: atest CtsCompanionDeviceManagerCoreTestCases
Test: atest CtsCompanionDeviceManagerUiAutomationTestCases
Test: manually install companion app, create a CDM Association with a
BLE companion device, uninstall the app.
Change-Id: Ie0ecab7fe61923ecef1541cb9f6450742c4b83b2
This commit is contained in:
@@ -171,12 +171,20 @@ class AssociationStoreImpl implements AssociationStore {
|
||||
broadcastChange(CHANGE_TYPE_REMOVED, association);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a "snapshot" of the current state of the existing associations.
|
||||
*/
|
||||
public @NonNull Collection<AssociationInfo> getAssociations() {
|
||||
final Collection<AssociationInfo> allAssociations;
|
||||
synchronized (mLock) {
|
||||
allAssociations = mIdMap.values();
|
||||
// IMPORTANT: make and return a COPY of the mIdMap.values(), NOT a "direct" reference.
|
||||
// The HashMap.values() returns a collection which is backed by the HashMap, so changes
|
||||
// to the HashMap are reflected in this collection.
|
||||
// For us this means that if mIdMap is modified while the iteration over mIdMap.values()
|
||||
// is in progress it may lead to "undefined results" (according to the HashMap's
|
||||
// documentation) or cause ConcurrentModificationExceptions in the iterator (according
|
||||
// to the bugreports...).
|
||||
return List.copyOf(mIdMap.values());
|
||||
}
|
||||
return Collections.unmodifiableCollection(allAssociations);
|
||||
}
|
||||
|
||||
public @NonNull List<AssociationInfo> getAssociationsForUser(@UserIdInt int userId) {
|
||||
|
||||
Reference in New Issue
Block a user