RFR: 8253086: Optimization of removeAll and retainAll of ObservableListWrapper [v4]
Jeanette Winzenburg
fastegal at openjdk.java.net
Sat Oct 3 11:30:37 UTC 2020
On Fri, 2 Oct 2020 18:20:18 GMT, Kevin Rushforth <kcr at openjdk.org> wrote:
>>> the reason BitSet was introduced was to ensure that the elements are removed from this List in reverse order (prior to
>>> that fix, they were removed in forward order with the loop index being messed up).
>>
>> But why do they need to be removed in reverse order to begin with? The super implementation does forward removal, or
>> just use `removeIf`.
>
> It might not matter any more (presuming that it was done correctly), but it seems safer to leave the logic as-is to
> match the existing behavior.
the problem was (and still is) in MultipleSelectionModelBase:
selectedItems = new SelectedItemsReadOnlyObservableList<T>(selectedIndices, () -> getItemCount()) {
@Override protected T getModelItem(int index) {
return MultipleSelectionModelBase.this.getModelItem(index);
}
};
meaning that the selectedItems change during the removal of items (that's plain wrong!) which shows when removing the
items from the start:
// removeAll before fix of
for (int i = 0; i < size(); ++i) {
if (c.contains(get(i))) {
remove(i);
--i;
modified = true;
}
}
doing so is basically valid (note the decremented i). Just the selectedItems look into the underlying model, so **c**
is changing during the removal which is a no-go.
Returning to the old (pre [JDK-8093144](https://bugs.openjdk.java.net/browse/JDK-8093144)) still makes the tests
against it fail (ListViewTest.test_rt35857 f.i.).
Still wondering why the detour over the BitSet was choosen as fix (vs. the more natural remove-from-last). The listView
test is passing for the bitSet and for the back-to-front approach. Can we imagine a context where the broken
selectedItems impl would add wreckage to the latter?
-------------
PR: https://git.openjdk.java.net/jfx/pull/305
More information about the openjfx-dev
mailing list