From edf71b3a0e03f13a9537076551718e2a995ecebe Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 2 Jan 2017 11:41:36 +0100 Subject: [PATCH 1/1] BUG-7464: remove uneeded casts and similar warnings In some places we do not need to cast nodes to their generic arguments, so eliminate a couple of warnings. Also remove global TrieMap @SuppressWarnings and add suppressions as needed. Change-Id: Ia060097673052ab5ab214704c2980db5052919f8 Signed-off-by: Robert Varga --- .../opendaylight/yangtools/triemap/CNode.java | 33 +++---- .../yangtools/triemap/FailedNode.java | 2 +- .../opendaylight/yangtools/triemap/INode.java | 45 +++++----- .../opendaylight/yangtools/triemap/LNode.java | 2 +- .../yangtools/triemap/MainNode.java | 2 +- .../opendaylight/yangtools/triemap/TNode.java | 2 +- .../yangtools/triemap/TrieMap.java | 89 +++++++++---------- 7 files changed, 83 insertions(+), 92 deletions(-) diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/CNode.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/CNode.java index ba6109eea7..b16355d67e 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/CNode.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/CNode.java @@ -61,7 +61,7 @@ final class CNode extends MainNode { // this should only be called from within read-only snapshots @Override - int cachedSize(final TrieMap ct) { + int cachedSize(final TrieMap ct) { int sz = csize; if (sz == NO_SIZE) { // We have not computed the size yet, do that now @@ -80,7 +80,7 @@ final class CNode extends MainNode { // => if there are concurrent size computations, they start // at different positions, so they are more likely to // to be independent - private int computeSize(final TrieMap ct) { + private int computeSize(final TrieMap ct) { int i = 0; int sz = 0; // final int offset = (array.length > 0) ? @@ -97,7 +97,7 @@ final class CNode extends MainNode { if (elem instanceof SNode) { sz += 1; } else if (elem instanceof INode) { - sz += ((INode) elem).cachedSize(ct); + sz += ((INode) elem).cachedSize(ct); } i += 1; } @@ -143,8 +143,7 @@ final class CNode extends MainNode { while (i < len) { BasicNode elem = arr[i]; if (elem instanceof INode) { - INode in = (INode) elem; - narr [i] = in.copyToGen(ngen, ct); + narr [i] = ((INode) elem).copyToGen(ngen, ct); } else if (elem != null) { narr [i] = elem; } @@ -153,20 +152,10 @@ final class CNode extends MainNode { return new CNode<>(ngen, bitmap, narr); } - private BasicNode resurrect(final INode inode, final Object inodemain) { - if (inodemain instanceof TNode) { - TNode tn = (TNode) inodemain; - return tn.copyUntombed(); - } - - return inode; - } - MainNode toContracted(final int lev) { if (array.length == 1 && lev > 0) { if (array[0] instanceof SNode) { - final SNode sn = (SNode) array[0]; - return sn.copyTombed(); + return ((SNode) array[0]).copyTombed(); } return this; } @@ -180,7 +169,7 @@ final class CNode extends MainNode { // returns the version of this node with at least some null-inodes // removed (those existing when the op began) // - if there are only null-i-nodes below, returns null - MainNode toCompressed(final TrieMap ct, final int lev, final Gen gen) { + MainNode toCompressed(final TrieMap ct, final int lev, final Gen gen) { int bmp = bitmap; int i = 0; BasicNode[] arr = array; @@ -188,10 +177,10 @@ final class CNode extends MainNode { while (i < arr.length) { // construct new bitmap BasicNode sub = arr[i]; if (sub instanceof INode) { - INode in = (INode) sub; - MainNode inodemain = in.gcasRead (ct); + final INode in = (INode) sub; + final MainNode inodemain = in.gcasRead(ct); assert (inodemain != null); - tmparray [i] = resurrect (in, inodemain); + tmparray [i] = resurrect(in, inodemain); } else if (sub instanceof SNode) { tmparray [i] = sub; } @@ -201,6 +190,10 @@ final class CNode extends MainNode { return new CNode(gen, bmp, tmparray).toContracted(lev); } + private static BasicNode resurrect(final INode inode, final MainNode inodemain) { + return inodemain instanceof TNode ? ((TNode) inodemain).copyUntombed() : inode; + } + @Override String string(final int lev) { // "CNode %x\n%s".format(bitmap, array.map(_.string(lev + diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/FailedNode.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/FailedNode.java index 74185053dd..a2ac9ca90c 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/FailedNode.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/FailedNode.java @@ -29,7 +29,7 @@ final class FailedNode extends MainNode { } @Override - int cachedSize(final TrieMap ct) { + int cachedSize(final TrieMap ct) { throw new UnsupportedOperationException(); } diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/INode.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/INode.java index 94f10ce901..b86d4c4152 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/INode.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/INode.java @@ -36,11 +36,11 @@ final class INode extends BasicNode { this.mainnode = mainnode; } - MainNode gcasRead(final TrieMap ct) { + MainNode gcasRead(final TrieMap ct) { return GCAS_READ(ct); } - MainNode GCAS_READ(final TrieMap ct) { + private MainNode GCAS_READ(final TrieMap ct) { MainNode m = /* READ */ mainnode; MainNode prevval = /* READ */ m.READ_PREV(); if (prevval == null) { @@ -50,7 +50,7 @@ final class INode extends BasicNode { return GCAS_Complete(m, ct); } - private MainNode GCAS_Complete(MainNode m, final TrieMap ct) { + private MainNode GCAS_Complete(MainNode m, final TrieMap ct) { while (true) { if (m == null) { return null; @@ -58,7 +58,7 @@ final class INode extends BasicNode { // complete the GCAS final MainNode prev = /* READ */ m.READ_PREV(); - final INode ctr = ct.readRoot(true); + final Gen rdgen = ct.readRoot(true).gen; if (prev == null) { return m; } @@ -83,7 +83,7 @@ final class INode extends BasicNode { // ==> if `ctr.gen` = `gen` then they are both equal to G. // ==> otherwise, we know that either `ctr.gen` > G, `gen` < G, // or both - if (ctr.gen == gen && !ct.isReadOnly()) { + if (rdgen == gen && !ct.isReadOnly()) { // try to commit if (m.CAS_PREV(prev, null)) { return m; @@ -101,7 +101,7 @@ final class INode extends BasicNode { } } - private boolean GCAS(final MainNode old, final MainNode n, final TrieMap ct) { + private boolean GCAS(final MainNode old, final MainNode n, final TrieMap ct) { n.WRITE_PREV(old); if (MAINNODE_UPDATER.compareAndSet(this, old, n)) { GCAS_Complete(n, ct); @@ -115,7 +115,7 @@ final class INode extends BasicNode { return new INode<>(gen, cn); } - INode copyToGen(final Gen ngen, final TrieMap ct) { + INode copyToGen(final Gen ngen, final TrieMap ct) { return new INode<>(ngen, GCAS_READ(ct)); } @@ -168,8 +168,8 @@ final class INode extends BasicNode { return GCAS (cn, nn, ct); } } else { - CNode rn = (cn.gen == gen) ? cn : cn.renewed(gen, ct); - MainNode ncnode = rn.insertedAt(pos, flag, new SNode<> (k, v, hc), gen); + final CNode rn = (cn.gen == gen) ? cn : cn.renewed(gen, ct); + final MainNode ncnode = rn.insertedAt(pos, flag, new SNode<>(k, v, hc), gen); return GCAS (cn, ncnode, ct); } } else if (m instanceof TNode) { @@ -427,19 +427,19 @@ final class INode extends BasicNode { /** * Removes the key associated with the given value. * - * @param v + * @param cond * if null, will remove the key regardless of the value; * otherwise removes only if binding contains that exact key * and value - * @return null if not successful, an Option[V] indicating the previous + * @return null if not successful, an Optional indicating the previous * value otherwise */ - Optional rec_remove(final K k, final V v, final int hc, final int lev, final INode parent, + Optional rec_remove(final K k, final Object cond, final int hc, final int lev, final INode parent, final TrieMap ct) { - return rec_remove(k, v, hc, lev, parent, gen, ct); + return rec_remove(k, cond, hc, lev, parent, gen, ct); } - private Optional rec_remove(final K k, final V v, final int hc, final int lev, final INode parent, + private Optional rec_remove(final K k, final Object cond, final int hc, final int lev, final INode parent, final Gen startgen, final TrieMap ct) { final MainNode m = GCAS_READ(ct); // use -Yinline! @@ -458,10 +458,10 @@ final class INode extends BasicNode { if (sub instanceof INode) { final INode in = (INode) sub; if (startgen == in.gen) { - res = in.rec_remove(k, v, hc, lev + 5, this, startgen, ct); + res = in.rec_remove(k, cond, hc, lev + 5, this, startgen, ct); } else { if (GCAS(cn, cn.renewed (startgen, ct), ct)) { - res = rec_remove(k, v, hc, lev, parent, startgen, ct); + res = rec_remove(k, cond, hc, lev, parent, startgen, ct); } else { res = null; } @@ -469,7 +469,7 @@ final class INode extends BasicNode { } else if (sub instanceof SNode) { final SNode sn = (SNode) sub; - if (sn.hc == hc && ct.equal(sn.k, k) && (v == null || v.equals(sn.v))) { + if (sn.hc == hc && ct.equal(sn.k, k) && (cond == null || cond.equals(sn.v))) { final MainNode ncn = cn.removedAt(pos, flag, gen).toContracted(lev); if (GCAS(cn, ncn, ct)) { res = Optional.of(sn.v); @@ -506,7 +506,7 @@ final class INode extends BasicNode { } final V value = entry.value(); - if (v != null && !v.equals(value)) { + if (cond != null && !cond.equals(value)) { // Value does not match return Optional.empty(); } @@ -539,8 +539,8 @@ final class INode extends BasicNode { final BasicNode sub = cn.array[pos]; if (sub == this) { if (nonlive instanceof TNode) { - final TNode tn = (TNode) nonlive; - MainNode ncn = cn.updatedAt(pos, tn.copyUntombed(), gen).toContracted(lev - 5); + final TNode tn = (TNode) nonlive; + final MainNode ncn = cn.updatedAt(pos, tn.copyUntombed(), gen).toContracted(lev - 5); if (!parent.GCAS(cn, ncn, ct)) { if (ct.readRoot().gen == startgen) { // Tail recursion: cleanParent(nonlive, parent, ct, hc, lev, startgen); @@ -561,9 +561,8 @@ final class INode extends BasicNode { } } - int cachedSize(final TrieMap ct) { - MainNode m = GCAS_READ(ct); - return m.cachedSize(ct); + int cachedSize(final TrieMap ct) { + return GCAS_READ(ct).cachedSize(ct); } // /* this is a quiescent method! */ diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/LNode.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/LNode.java index 0bc4c92525..40d2b782b2 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/LNode.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/LNode.java @@ -57,7 +57,7 @@ final class LNode extends MainNode { } @Override - int cachedSize(final TrieMap ct) { + int cachedSize(final TrieMap ct) { return listmap.size(); } diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MainNode.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MainNode.java index fcc747160f..ac0af2f417 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MainNode.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MainNode.java @@ -32,7 +32,7 @@ abstract class MainNode extends BasicNode { this.prev = prev; } - abstract int cachedSize(TrieMap ct); + abstract int cachedSize(TrieMap ct); final boolean CAS_PREV(final MainNode oldval, final MainNode nval) { return PREV_UPDATER.compareAndSet(this, oldval, nval); diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TNode.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TNode.java index 45913d1b41..e845816c77 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TNode.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TNode.java @@ -39,7 +39,7 @@ final class TNode extends MainNode implements EntryNode { } @Override - int cachedSize(final TrieMap ct) { + int cachedSize(final TrieMap ct) { return 1; } diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java index e421646ed0..e8818a4b1e 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java @@ -28,7 +28,6 @@ import java.io.Serializable; import java.util.AbstractMap; import java.util.AbstractSet; import java.util.ArrayList; -import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; @@ -46,8 +45,8 @@ import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; * @param the type of keys maintained by this map * @param the type of mapped values */ -@SuppressWarnings({"unchecked", "rawtypes", "unused"}) public final class TrieMap extends AbstractMap implements ConcurrentMap, Serializable { + @SuppressWarnings("rawtypes") private static final AtomicReferenceFieldUpdater ROOT_UPDATER = AtomicReferenceFieldUpdater.newUpdater(TrieMap.class, Object.class, "root"); private static final long serialVersionUID = 1L; @@ -86,9 +85,13 @@ public final class TrieMap extends AbstractMap implements Concurrent return new INode<>(gen, new CNode<>(gen)); } - final boolean CAS_ROOT(final Object ov, final Object nv) { + private boolean CAS_ROOT(final Object ov, final Object nv) { checkState(!readOnly, "Attempted to modify a read-only snapshot"); - return ROOT_UPDATER.compareAndSet (this, ov, nv); + return ROOT_UPDATER.compareAndSet(this, ov, nv); + } + + final INode readRoot() { + return RDCSS_READ_ROOT(false); } // FIXME: abort = false by default @@ -96,16 +99,12 @@ public final class TrieMap extends AbstractMap implements Concurrent return RDCSS_READ_ROOT(abort); } - final INode readRoot() { + private final INode RDCSS_READ_ROOT() { return RDCSS_READ_ROOT(false); } - final INode RDCSS_READ_ROOT() { - return RDCSS_READ_ROOT(false); - } - - final INode RDCSS_READ_ROOT(final boolean abort) { - final Object r = /* READ */root; + private final INode RDCSS_READ_ROOT(final boolean abort) { + final Object r = /* READ */ root; if (r instanceof INode) { return (INode) r; } @@ -116,12 +115,13 @@ public final class TrieMap extends AbstractMap implements Concurrent private INode RDCSS_Complete(final boolean abort) { while (true) { - final Object r = /* READ */root; + final Object r = /* READ */ root; if (r instanceof INode) { return (INode) r; } checkState(r instanceof RDCSS_Descriptor, "Unhandled root %s", r); + @SuppressWarnings("unchecked") final RDCSS_Descriptor desc = (RDCSS_Descriptor) r; final INode ov = desc.old; final MainNode exp = desc.expectedmain; @@ -168,11 +168,15 @@ public final class TrieMap extends AbstractMap implements Concurrent private void inserthc(final K k, final int hc, final V v) { // TODO: this is called from serialization only, which means we should not be observing any races, // hence we should not need to pass down the entire tree, just equality (I think). - final INode r = RDCSS_READ_ROOT(); - final boolean success = r.rec_insert(k, v, hc, 0, null, this); + final boolean success = RDCSS_READ_ROOT().rec_insert(k, v, hc, 0, null, this); Verify.verify(success, "Concurrent modification during serialization of map %s", this); } + void add(final K key, final V value) { + final K k = checkNotNull(key); + inserthc(k, computeHash(k), checkNotNull(value)); + } + private Optional insertifhc(final K k, final int hc, final V v, final Object cond) { Optional res; do { @@ -183,6 +187,7 @@ public final class TrieMap extends AbstractMap implements Concurrent return res; } + @SuppressWarnings("unchecked") private V lookuphc(final K k, final int hc) { Object res; do { @@ -193,11 +198,11 @@ public final class TrieMap extends AbstractMap implements Concurrent return (V) res; } - private Optional removehc(final K k, final V v, final int hc) { + private Optional removehc(final K k, final Object cond, final int hc) { Optional res; do { // Keep looping as long as we do not get a reply - res = RDCSS_READ_ROOT().rec_remove(k, v, hc, 0, null, this); + res = RDCSS_READ_ROOT().rec_remove(k, cond, hc, 0, null, this); } while (res == null); return res; @@ -290,41 +295,44 @@ public final class TrieMap extends AbstractMap implements Concurrent @Override public V get(final Object key) { + @SuppressWarnings("unchecked") final K k = (K) checkNotNull(key); return lookuphc(k, computeHash(k)); } + @SuppressWarnings("null") + private static V toNullable(final Optional opt) { + return opt.orElse(null); + } + @Override public V put(final K key, final V value) { ensureReadWrite(); final K k = checkNotNull(key); - return insertifhc(k, computeHash(k), checkNotNull(value), null).orElse(null); - } - - void add(final K key, final V value) { - final K k = checkNotNull(key); - inserthc(k, computeHash(k), checkNotNull(value)); + return toNullable(insertifhc(k, computeHash(k), checkNotNull(value), null)); } @Override public V remove(final Object key) { ensureReadWrite(); + @SuppressWarnings("unchecked") final K k = (K) checkNotNull(key); - return removehc(k, (V) null, computeHash(k)).orElse(null); + return toNullable(removehc(k, null, computeHash(k))); } @Override public V putIfAbsent(final K key, final V value) { ensureReadWrite(); final K k = checkNotNull(key); - return insertifhc(k, computeHash(k), checkNotNull(value), ABSENT).orElse(null); + return toNullable(insertifhc(k, computeHash(k), checkNotNull(value), ABSENT)); } @Override public boolean remove(final Object key, final Object v) { ensureReadWrite(); + @SuppressWarnings("unchecked") final K k = (K) checkNotNull(key); - return removehc(k, (V) checkNotNull(v), computeHash(k)).isPresent(); + return removehc(k, checkNotNull(v), computeHash(k)).isPresent(); } @Override @@ -338,7 +346,7 @@ public final class TrieMap extends AbstractMap implements Concurrent public V replace(final K key, final V value) { ensureReadWrite(); final K k = checkNotNull(key); - return insertifhc (k, computeHash(k), checkNotNull(value), PRESENT).orElse(null); + return toNullable(insertifhc(k, computeHash(k), checkNotNull(value), PRESENT)); } /*** @@ -366,8 +374,7 @@ public final class TrieMap extends AbstractMap implements Concurrent } private int cachedSize() { - INode r = RDCSS_READ_ROOT (); - return r.cachedSize (this); + return RDCSS_READ_ROOT().cachedSize (this); } @Override @@ -471,13 +478,13 @@ public final class TrieMap extends AbstractMap implements Concurrent throw new NoSuchElementException(); } - Entry r = null; + final Entry r; if (subiter != null) { - r = subiter.next (); - checkSubiter (); + r = subiter.next(); + checkSubiter(); } else { r = current; - advance (); + advance(); } lastReturned = r; @@ -490,6 +497,7 @@ public final class TrieMap extends AbstractMap implements Concurrent Entry nextEntry(final Entry rr) { return new Entry() { + @SuppressWarnings("null") private V updated = null; @Override @@ -539,8 +547,7 @@ public final class TrieMap extends AbstractMap implements Concurrent // @inline void initialize () { // assert (ct.isReadOnly ()); - INode r = ct.RDCSS_READ_ROOT (); - readin (r); + readin(ct.RDCSS_READ_ROOT()); } void advance () { @@ -563,11 +570,11 @@ public final class TrieMap extends AbstractMap implements Concurrent } } - protected TrieMapIterator newIterator (final int _lev, final TrieMap _ct, final boolean _mustInit) { + protected TrieMapIterator newIterator(final int _lev, final TrieMap _ct, final boolean _mustInit) { return new TrieMapIterator<> (_lev, _ct, _mustInit); } - protected void dupTo (final TrieMapIterator it) { + protected void dupTo(final TrieMapIterator it) { it.level = this.level; it.ct = this.ct; it.depth = this.depth; @@ -632,14 +639,6 @@ public final class TrieMap extends AbstractMap implements Concurrent return list; } - void printDebug () { - System.out.println ("ctrie iterator"); - System.out.println (Arrays.toString (stackpos)); - System.out.println ("depth: " + depth); - System.out.println ("curr.: " + current); - // System.out.println(stack.mkString("\n")); - } - @Override public void remove() { checkState(lastReturned != null); @@ -676,7 +675,7 @@ public final class TrieMap extends AbstractMap implements Concurrent if (!(o instanceof Entry)) { return false; } - final Entry e = (Entry) o; + final Entry e = (Entry) o; final Object key = e.getKey(); if (key == null) { return false; -- 2.36.6