- MainNode<K, V> pm = parent.GCAS_READ(ct);
- if (pm instanceof CNode) {
- CNode<K, V> cn = (CNode<K, V>) pm;
- int idx = (hc >>> (lev - 5)) & 0x1f;
- int bmp = cn.bitmap;
- int flag = 1 << idx;
- if ((bmp & flag) == 0) {
- // somebody already removed this i-node, we're done
- } else {
- int pos = Integer.bitCount(bmp & (flag - 1));
- BasicNode sub = cn.array[pos];
- if (sub == this) {
- if (nonlive instanceof TNode) {
- TNode<K, V> tn = (TNode<K, V>) nonlive;
- MainNode<K, V> ncn = cn.updatedAt(pos, tn.copyUntombed (), gen).toContracted (lev - 5);
- if (!parent.GCAS(cn, ncn, ct)) {
- if (ct.readRoot().gen == startgen) {
- // cleanParent (nonlive, parent, ct, hc,
- // lev, startgen);
- // tailrec
- continue;
- }
- }
- }
+ final MainNode<K, V> pm = parent.GCAS_READ(ct);
+ if ((!(pm instanceof CNode))) {
+ // parent is no longer a cnode, we're done
+ return;
+ }
+
+ final CNode<K, V> cn = (CNode<K, V>) pm;
+ final int idx = (hc >>> (lev - LEVEL_BITS)) & 0x1f;
+ final int bmp = cn.bitmap;
+ final int flag = 1 << idx;
+ if ((bmp & flag) == 0) {
+ // somebody already removed this i-node, we're done
+ return;
+ }
+
+ final int pos = Integer.bitCount(bmp & (flag - 1));
+ final BasicNode sub = cn.array[pos];
+ if (sub == this && nonlive instanceof TNode) {
+ final TNode<?, ?> tn = (TNode<?, ?>) nonlive;
+ final MainNode<K, V> ncn = cn.updatedAt(pos, tn.copyUntombed(), gen).toContracted(lev - LEVEL_BITS);
+ if (!parent.GCAS(cn, ncn, ct)) {
+ if (ct.readRoot().gen == startgen) {
+ // Tail recursion: cleanParent(nonlive, parent, ct, hc, lev, startgen);
+ continue;