mirror of
https://github.com/openjdk/jdk.git
synced 2026-06-03 01:02:37 +00:00
8166507: ConcurrentSkipListSet.clear() can leave the Set in an invalid state
Reviewed-by: martin, smarks, psandoz
This commit is contained in:
parent
3d0d86185e
commit
58623faf53
@ -1650,7 +1650,24 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
|
||||
* Removes all of the mappings from this map.
|
||||
*/
|
||||
public void clear() {
|
||||
initialize();
|
||||
for (;;) {
|
||||
Node<K,V> b, n;
|
||||
HeadIndex<K,V> h = head, d = (HeadIndex<K,V>)h.down;
|
||||
if (d != null)
|
||||
casHead(h, d); // remove levels
|
||||
else if ((b = h.node) != null && (n = b.next) != null) {
|
||||
Node<K,V> f = n.next; // remove values
|
||||
if (n == b.next) {
|
||||
Object v = n.value;
|
||||
if (v == null)
|
||||
n.helpDelete(b, f);
|
||||
else if (n.casValue(v, null) && n.appendMarker(f))
|
||||
b.casNext(n, f);
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user