From 51594df8bbe32274c7fbf62ffa7b63223c6e0356 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 30 Dec 2016 13:07:56 +0100 Subject: [PATCH] BUG-7464: Hide MainNode.prev field and its updater 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 --- .../yangtools/triemap/FailedNode.java | 4 ++-- .../opendaylight/yangtools/triemap/INode.java | 10 ++++---- .../yangtools/triemap/MainNode.java | 23 ++++++++----------- 3 files changed, 17 insertions(+), 20 deletions(-) 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 0bc06acbcf..a766c251d5 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 @@ -18,9 +18,9 @@ package org.opendaylight.yangtools.triemap; final class FailedNode extends MainNode { private final MainNode p; - FailedNode (final MainNode p) { + FailedNode(final MainNode p) { this.p = p; - WRITE_PREV (p); + WRITE_PREV(p); } @Override 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 1c7167ebae..a712a81d5b 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 @@ -48,7 +48,7 @@ final class INode extends INodeBase { MainNode GCAS_READ(final TrieMap ct) { MainNode m = /* READ */mainnode; - MainNode prevval = /* READ */m.prev; + MainNode prevval = /* READ */ m.READ_PREV(); if (prevval == null) { return m; } else { @@ -62,7 +62,7 @@ final class INode extends INodeBase { return null; } else { // complete the GCAS - MainNode prev = /* READ */m.prev; + MainNode prev = /* READ */ m.READ_PREV(); INode ctr = ct.readRoot(true); if (prev == null) { @@ -72,8 +72,8 @@ final class INode extends INodeBase { if (prev instanceof FailedNode) { // try to commit to previous value FailedNode fn = (FailedNode) 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 extends INodeBase { 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; } 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 8d28b4f82e..dca11eeeb5 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 @@ -18,26 +18,23 @@ package org.opendaylight.yangtools.triemap; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; abstract class MainNode extends BasicNode { + @SuppressWarnings("rawtypes") + private static final AtomicReferenceFieldUpdater PREV_UPDATER = + AtomicReferenceFieldUpdater.newUpdater(MainNode.class, MainNode.class, "prev"); - public static final AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater (MainNode.class, MainNode.class, "prev"); - - public volatile MainNode prev = null; + private volatile MainNode prev = null; abstract int cachedSize(TrieMap ct); - public boolean CAS_PREV (final MainNode oldval, final MainNode nval) { - return updater.compareAndSet (this, oldval, nval); + final boolean CAS_PREV(final MainNode oldval, final MainNode nval) { + return PREV_UPDATER.compareAndSet(this, oldval, nval); } - public void WRITE_PREV (final MainNode nval) { - updater.set (this, nval); + final void WRITE_PREV(final MainNode 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 READ_PREV () { - return updater.get (this); + final MainNode READ_PREV() { + return prev; } - } -- 2.36.6