BUG-7464: Hide MainNode.prev field and its updater 68/49868/6
authorRobert Varga <rovarga@cisco.com>
Fri, 30 Dec 2016 12:07:56 +0000 (13:07 +0100)
committerRobert Varga <rovarga@cisco.com>
Mon, 9 Jan 2017 14:17:12 +0000 (15:17 +0100)
This field is only ever read from other classes, hence we can
hide it behind READ_PREV(). The updater is also not accessed
from anywhere else, hence make it private.

Change-Id: I13e2e5a85ef502e7ad12f27d0309cd7a9ec6803a
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/FailedNode.java
third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/INode.java
third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MainNode.java

index 0bc06acbcfd63f18ccedd53a7f1bb23f0ca7eff8..a766c251d5cf4b3ccb25ad50d501f598aa4ddef0 100644 (file)
@@ -18,9 +18,9 @@ package org.opendaylight.yangtools.triemap;
 final class FailedNode<K, V> extends MainNode<K, V> {
     private final MainNode<K, V> p;
 
-    FailedNode (final MainNode<K, V> p) {
+    FailedNode(final MainNode<K, V> p) {
         this.p = p;
-        WRITE_PREV (p);
+        WRITE_PREV(p);
     }
 
     @Override
index 1c7167ebae6c6344ceab5ed9969845f287d5808b..a712a81d5b807a5bdf4625dc35da2793eedf7f73 100644 (file)
@@ -48,7 +48,7 @@ final class INode<K, V> extends INodeBase<K, V> {
 
     MainNode<K, V> GCAS_READ(final TrieMap<K, V> ct) {
         MainNode<K, V> m = /* READ */mainnode;
-        MainNode<K, V> prevval = /* READ */m.prev;
+        MainNode<K, V> prevval = /* READ */ m.READ_PREV();
         if (prevval == null) {
             return m;
         } else {
@@ -62,7 +62,7 @@ final class INode<K, V> extends INodeBase<K, V> {
                 return null;
             } else {
                 // complete the GCAS
-                MainNode<K, V> prev = /* READ */m.prev;
+                MainNode<K, V> prev = /* READ */ m.READ_PREV();
                 INode<K, V> ctr = ct.readRoot(true);
 
                 if (prev == null) {
@@ -72,8 +72,8 @@ final class INode<K, V> extends INodeBase<K, V> {
                 if (prev instanceof FailedNode) {
                     // try to commit to previous value
                     FailedNode<K, V> fn = (FailedNode<K, V>) prev;
-                    if (CAS(m, fn.prev)) {
-                        return fn.prev;
+                    if (CAS(m, fn.READ_PREV())) {
+                        return fn.READ_PREV();
                     } else {
                         // Tailrec
                         // return GCAS_Complete (/* READ */mainnode, ct);
@@ -117,7 +117,7 @@ final class INode<K, V> extends INodeBase<K, V> {
         n.WRITE_PREV (old);
         if (CAS (old, n)) {
             GCAS_Complete (n, ct);
-            return /* READ */n.prev == null;
+            return /* READ */ n.READ_PREV() == null;
         } else {
             return false;
         }
index 8d28b4f82efb4a61b99dfd8e1a8ff5970a28b3fd..dca11eeeb5ff401048b860d367f73a01d4a140e4 100644 (file)
@@ -18,26 +18,23 @@ package org.opendaylight.yangtools.triemap;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 
 abstract class MainNode<K, V> extends BasicNode {
+    @SuppressWarnings("rawtypes")
+    private static final AtomicReferenceFieldUpdater<MainNode, MainNode> PREV_UPDATER =
+        AtomicReferenceFieldUpdater.newUpdater(MainNode.class, MainNode.class, "prev");
 
-    public static final AtomicReferenceFieldUpdater<MainNode, MainNode> updater = AtomicReferenceFieldUpdater.newUpdater (MainNode.class, MainNode.class, "prev");
-
-    public volatile MainNode<K, V> prev = null;
+    private volatile MainNode<K, V> prev = null;
 
     abstract int cachedSize(TrieMap<K, V> ct);
 
-    public boolean CAS_PREV (final MainNode<K, V> oldval, final MainNode<K, V> nval) {
-        return updater.compareAndSet (this, oldval, nval);
+    final boolean CAS_PREV(final MainNode<K, V> oldval, final MainNode<K, V> nval) {
+        return PREV_UPDATER.compareAndSet(this, oldval, nval);
     }
 
-    public void WRITE_PREV (final MainNode<K, V> nval) {
-        updater.set (this, nval);
+    final void WRITE_PREV(final MainNode<K, V> nval) {
+        prev = nval;
     }
 
-    // do we need this? unclear in the javadocs...
-    // apparently not - volatile reads are supposed to be safe
-    // regardless of whether there are concurrent ARFU updates
-    public MainNode<K, V> READ_PREV () {
-        return updater.get (this);
+    final MainNode<K, V> READ_PREV() {
+        return prev;
     }
-
 }