Do not use ClassToInstanceMap in AugmentableCodecDataObject 53/81853/2
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 1 May 2019 15:05:46 +0000 (17:05 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 1 May 2019 15:08:42 +0000 (17:08 +0200)
ImmutableClassToInstanceMap is implemented using delegation,
which means we end up allocating one more object than we really
need and are also adding an indirection.

Drop back to using a plain ImmutableMap, so as to reduce memory
pressure.

JIRA: MDSAL-442
Change-Id: I6832eb8f012a2d003d3a2158009305a09f6c7832
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java

index d94c3f7c28604fff0cdc60b7aa2029cd5b606944..0ab5ef23f9ad18fbdfb426a7a534e54cabfbc4cd 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.MoreObjects.ToStringHelper;
-import com.google.common.collect.ImmutableClassToInstanceMap;
+import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
@@ -37,10 +37,10 @@ public abstract class AugmentableCodecDataObject<T extends DataObject & Augmenta
     private final @NonNull DataObjectCodecContext<T, ?> context;
 
     @SuppressWarnings("rawtypes")
-    private static final AtomicReferenceFieldUpdater<AugmentableCodecDataObject, ImmutableClassToInstanceMap>
+    private static final AtomicReferenceFieldUpdater<AugmentableCodecDataObject, ImmutableMap>
             CACHED_AUGMENTATIONS_UPDATER = AtomicReferenceFieldUpdater.newUpdater(AugmentableCodecDataObject.class,
-                ImmutableClassToInstanceMap.class, "cachedAugmentations");
-    private volatile ImmutableClassToInstanceMap<Augmentation<T>> cachedAugmentations;
+                ImmutableMap.class, "cachedAugmentations");
+    private volatile ImmutableMap<Class<? extends Augmentation<T>>, Augmentation<T>> cachedAugmentations;
 
     protected AugmentableCodecDataObject(final DataObjectCodecContext<T, ?> context,
             final NormalizedNodeContainer<?, ?, ?> data) {
@@ -48,13 +48,14 @@ public abstract class AugmentableCodecDataObject<T extends DataObject & Augmenta
         this.context = requireNonNull(context, "Context must not be null");
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public final <A extends Augmentation<T>> @Nullable A augmentation(final Class<A> augmentationType) {
         requireNonNull(augmentationType, "Supplied augmentation must not be null.");
 
-        final ImmutableClassToInstanceMap<Augmentation<T>> aug = cachedAugmentations;
+        final ImmutableMap<Class<? extends Augmentation<T>>, Augmentation<T>> aug = cachedAugmentations;
         if (aug != null) {
-            return aug.getInstance(augmentationType);
+            return (A) aug.get(augmentationType);
         }
 
         @SuppressWarnings({"unchecked","rawtypes"})
@@ -78,13 +79,13 @@ public abstract class AugmentableCodecDataObject<T extends DataObject & Augmenta
     }
 
     @Override
-    public final Map<Class<? extends Augmentation<T>>, Augmentation<T>> augmentations() {
-        ImmutableClassToInstanceMap<Augmentation<T>> local = cachedAugmentations;
+    public final ImmutableMap<Class<? extends Augmentation<T>>, Augmentation<T>> augmentations() {
+        ImmutableMap<Class<? extends Augmentation<T>>, Augmentation<T>> local = cachedAugmentations;
         if (local != null) {
             return local;
         }
 
-        local = ImmutableClassToInstanceMap.copyOf(context.getAllAugmentationsFrom(codecData()));
+        local = ImmutableMap.copyOf(context.getAllAugmentationsFrom(codecData()));
         return CACHED_AUGMENTATIONS_UPDATER.compareAndSet(this, null, local) ? local : cachedAugmentations;
     }