@Override
public void clear() {
- boolean success;
+ INode<K, V> r;
do {
- final INode<K, V> r = RDCSS_READ_ROOT();
- success = RDCSS_ROOT(r, r.gcasRead(this), newRootNode());
- } while (!success);
+ r = RDCSS_READ_ROOT();
+ } while (!RDCSS_ROOT(r, r.gcasRead(this), newRootNode()));
}
@Override
}
@SuppressFBWarnings(value = "NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE",
- justification = "API contract allows null value, but we are not")
+ justification = "API contract allows null value, but we do not")
@Override
public boolean remove(final Object key, final Object value) {
@SuppressWarnings("unchecked")
return immutableSnapshot().size();
}
+ private INode<K, V> snapshot() {
+ INode<K, V> r;
+ do {
+ r = RDCSS_READ_ROOT();
+ } while (!RDCSS_ROOT(r, r.gcasRead(this), r.copyToGen(new Gen(), this)));
+
+ return r;
+ }
+
@Override
public ImmutableTrieMap<K, V> immutableSnapshot() {
- while (true) {
- final INode<K, V> r = RDCSS_READ_ROOT();
- final MainNode<K, V> expmain = r.gcasRead(this);
- if (RDCSS_ROOT(r, expmain, r.copyToGen(new Gen(), this))) {
- return new ImmutableTrieMap<>(r, equiv());
- }
-
- // Tail recursion: return readOnlySnapshot();
- }
+ return new ImmutableTrieMap<>(snapshot(), equiv());
}
@Override
public MutableTrieMap<K, V> mutableSnapshot() {
- while (true) {
- final INode<K, V> r = RDCSS_READ_ROOT();
- final MainNode<K, V> expmain = r.gcasRead(this);
- if (RDCSS_ROOT(r, expmain, r.copyToGen(new Gen(), this))) {
- return new MutableTrieMap<>(equiv(), r.copyToGen(new Gen(), this));
- }
-
- // Tail recursion: return snapshot();
- }
+ return new MutableTrieMap<>(equiv(), snapshot().copyToGen(new Gen(), this));
}
@Override
}
@Override
+ @SuppressWarnings("unchecked")
INode<K, V> RDCSS_READ_ROOT(final boolean abort) {
final Object r = /* READ */ root;
if (r instanceof INode) {
return false;
}
+ @SuppressWarnings("unchecked")
private INode<K, V> RDCSS_Complete(final boolean abort) {
while (true) {
final Object r = /* READ */ root;
}
checkState(r instanceof RDCSS_Descriptor, "Unhandled root %s", r);
- @SuppressWarnings("unchecked")
final RDCSS_Descriptor<K, V> desc = (RDCSS_Descriptor<K, V>) r;
final INode<K, V> ov = desc.old;
final MainNode<K, V> exp = desc.expectedmain;