X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=third-party%2Ftriemap%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Ftriemap%2FCNode.java;h=ba6109eea76de4900e364390c00ec2a59766b428;hb=65bacf4e15665b41e84537ad3bf9adfe80c0d4d3;hp=3784ede483e6c3fe3b74a1f54126dc6ada0c9361;hpb=b01003038559b7ced7e5d6056dab30ee9a3fd909;p=yangtools.git 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 3784ede483..ba6109eea7 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 @@ -15,13 +15,22 @@ */ package org.opendaylight.yangtools.triemap; -final class CNode extends CNodeBase { +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; + +final class CNode extends MainNode { + @SuppressWarnings("rawtypes") + private static final AtomicIntegerFieldUpdater CSIZE_UPDATER = AtomicIntegerFieldUpdater.newUpdater( + CNode.class, "csize"); + private static final BasicNode[] EMPTY_ARRAY = new BasicNode[0]; + private static final int NO_SIZE = -1; final int bitmap; final BasicNode[] array; final Gen gen; + private volatile int csize = NO_SIZE; + private CNode(final Gen gen, final int bitmap, final BasicNode... array) { this.bitmap = bitmap; this.array = array; @@ -53,16 +62,17 @@ final class CNode extends CNodeBase { // this should only be called from within read-only snapshots @Override int cachedSize(final TrieMap ct) { - final int currsz = READ_SIZE(); - if (currsz != -1) { - return currsz; + int sz = csize; + if (sz == NO_SIZE) { + // We have not computed the size yet, do that now + sz = computeSize(ct); + if (!CSIZE_UPDATER.compareAndSet(this, NO_SIZE, sz)) { + // We have been pre-empted by some else: read the result + sz = csize; + } } - final int sz = computeSize(ct); - while (READ_SIZE () == -1) { - CAS_SIZE (-1, sz); - } - return READ_SIZE (); + return sz; } // lends itself towards being parallelizable by choosing @@ -87,7 +97,7 @@ final class CNode extends CNodeBase { if (elem instanceof SNode) { sz += 1; } else if (elem instanceof INode) { - sz += ((INode) elem).cachedSize (ct); + sz += ((INode) elem).cachedSize(ct); } i += 1; }