private static final AtomicReferenceFieldUpdater<INode, MainNode> MAINNODE_UPDATER =
AtomicReferenceFieldUpdater.newUpdater(INode.class, MainNode.class, "mainnode");
- public final Gen gen;
+ private final Gen gen;
private volatile MainNode<K, V> mainnode;
*
* @return true if successful, false otherwise
*/
- boolean rec_insert(final K k, final V v, final int hc, final int lev, final INode<K, V> parent, final Gen startgen,
+ boolean rec_insert(final K k, final V v, final int hc, final int lev, final INode<K, V> parent,
final TrieMap<K, V> ct) {
+ return rec_insert(k, v, hc, lev, parent, gen, ct);
+ }
+
+ private boolean rec_insert(final K k, final V v, final int hc, final int lev, final INode<K, V> parent,
+ final Gen startgen, final TrieMap<K, V> ct) {
while (true) {
final MainNode<K, V> m = GCAS_READ (ct); // use -Yinline!
* previous value bound to the key)
*/
Optional<V> rec_insertif(final K k, final V v, final int hc, final Object cond, final int lev,
+ final INode<K, V> parent, final TrieMap<K, V> ct) {
+ return rec_insertif(k, v, hc, cond, lev, parent, gen, ct);
+ }
+
+ private Optional<V> rec_insertif(final K k, final V v, final int hc, final Object cond, final int lev,
final INode<K, V> parent, final Gen startgen, final TrieMap<K, V> ct) {
while (true) {
final MainNode<K, V> m = GCAS_READ(ct); // use -Yinline!
* @return null if no value has been found, RESTART if the operation
* wasn't successful, or any other value otherwise
*/
- Object rec_lookup(final K k, final int hc, final int lev, final INode<K, V> parent, final Gen startgen,
+ Object rec_lookup(final K k, final int hc, final int lev, final INode<K, V> parent, final TrieMap<K, V> ct) {
+ return rec_lookup(k, hc, lev, parent, gen, ct);
+ }
+
+ private Object rec_lookup(final K k, final int hc, final int lev, final INode<K, V> parent, final Gen startgen,
final TrieMap<K, V> ct) {
while (true) {
final MainNode<K, V> m = GCAS_READ(ct); // use -Yinline!
* value otherwise
*/
Optional<V> rec_remove(final K k, final V v, final int hc, final int lev, final INode<K, V> parent,
+ final TrieMap<K, V> ct) {
+ return rec_remove(k, v, hc, lev, parent, gen, ct);
+ }
+
+ private Optional<V> rec_remove(final K k, final V v, final int hc, final int lev, final INode<K, V> parent,
final Gen startgen, final TrieMap<K, V> ct) {
final MainNode<K, V> m = GCAS_READ(ct); // use -Yinline!
private void inserthc(final K k, final int hc, final V v) {
while (true) {
final INode<K, V> r = RDCSS_READ_ROOT();
- if (r.rec_insert(k, v, hc, 0, null, r.gen, this)) {
+ if (r.rec_insert(k, v, hc, 0, null, this)) {
// Successful, we are done
return;
}
private Optional<V> insertifhc(final K k, final int hc, final V v, final Object cond) {
while (true) {
final INode<K, V> r = RDCSS_READ_ROOT();
- final Optional<V> ret = r.rec_insertif(k, v, hc, cond, 0, null, r.gen, this);
+ final Optional<V> ret = r.rec_insertif(k, v, hc, cond, 0, null, this);
if (ret != null) {
return ret;
}
private Object lookuphc(final K k, final int hc) {
while (true) {
- final INode<K, V> r = RDCSS_READ_ROOT ();
- final Object res = r.rec_lookup(k, hc, 0, null, r.gen, this);
+ final INode<K, V> r = RDCSS_READ_ROOT();
+ final Object res = r.rec_lookup(k, hc, 0, null, this);
if (!INode.RESTART.equals(res)) {
return res;
}
private Optional<V> removehc(final K k, final V v, final int hc) {
while (true) {
final INode<K, V> r = RDCSS_READ_ROOT();
- final Optional<V> res = r.rec_remove(k, v, hc, 0, null, r.gen, this);
+ final Optional<V> res = r.rec_remove(k, v, hc, 0, null, this);
if (res != null) {
return res;
}