From: Robert Varga Date: Tue, 26 Nov 2019 22:09:49 +0000 (+0100) Subject: Switch streamer instantiation to VarHandles X-Git-Tag: v5.0.6~4 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=2922529e8704b9d1b506c99adb3617284384b5fe;p=mdsal.git Switch streamer instantiation to VarHandles Streamers are based on immutable data, hence we can safely drop their cache to release/acquire instead of the globally-ordered volatile semantics. JIRA: MDSAL-498 Change-Id: I36036908b0ae35dccc2b9016057ca1014373510d Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java index c7804b34f6..6624e3ab95 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java @@ -12,6 +12,8 @@ import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableSet; import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.util.List; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; @@ -33,11 +35,24 @@ import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus; abstract class DataContainerCodecContext extends NodeCodecContext implements BindingDataObjectCodecTreeNode { + private static final VarHandle EVENT_STREAM_SERIALIZER; + + static { + try { + EVENT_STREAM_SERIALIZER = MethodHandles.lookup().findVarHandle(DataContainerCodecContext.class, + "eventStreamSerializer", DataObjectSerializer.class); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new ExceptionInInitializerError(e); + } + } + private final @NonNull DataContainerCodecPrototype prototype; + // Accessed via a VarHandle + @SuppressWarnings("unused") private volatile DataObjectSerializer eventStreamSerializer; - protected DataContainerCodecContext(final DataContainerCodecPrototype prototype) { + DataContainerCodecContext(final DataContainerCodecPrototype prototype) { this.prototype = requireNonNull(prototype); } @@ -169,11 +184,16 @@ abstract class DataContainerCodecContext