From: Robert Varga Date: Tue, 14 Feb 2023 10:17:31 +0000 (+0100) Subject: Optimize ModifierImpl.AbstractPrerequisite X-Git-Tag: v10.0.4~2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=007dd4ccf28dd4288bafbce38a00c2b8d3ec2a68;p=yangtools.git Optimize ModifierImpl.AbstractPrerequisite Object analysis shows we are recording outer class multiple times, leading to suboptimimal object layout. Make the class hierarchy static, with outer class recorded in explicit field, reducing size of PhaseModificationInNamespacePath from 40-80 (48 typical) bytes to 32-64 (40 typical) bytes. Other subclasses observe a similar reduction. JIRA: YANGTOOLS-1486 Change-Id: Ifc3da86a564bc54f4247996e622787a8528422b7 Signed-off-by: Robert Varga --- diff --git a/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java b/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java index 110b34623e..d857e2b253 100644 --- a/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java +++ b/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java @@ -92,7 +92,7 @@ final class ModifierImpl implements ModelActionBuilder { final ModelProcessingPhase phase) { checkNotRegistered(); - AddedToNamespace addedToNs = new AddedToNamespace<>(phase); + final var addedToNs = new AddedToNamespace(this, phase); addReq(addedToNs); contextImpl(context).onNamespaceItemAddedAction(namespace, key, addedToNs); return addedToNs; @@ -103,7 +103,7 @@ final class ModifierImpl implements ModelActionBuilder { final NamespaceKeyCriterion criterion, final ModelProcessingPhase phase) { checkNotRegistered(); - AddedToNamespace addedToNs = new AddedToNamespace<>(phase); + final var addedToNs = new AddedToNamespace(this, phase); addReq(addedToNs); contextImpl(context).onNamespaceItemAddedAction(namespace, phase, criterion, addedToNs); return addedToNs; @@ -113,7 +113,7 @@ final class ModifierImpl implements ModelActionBuilder { final ModelProcessingPhase phase) { checkNotRegistered(); - PhaseFinished phaseFin = new PhaseFinished<>(); + final var phaseFin = new PhaseFinished(this); addReq(phaseFin); addBootstrap(() -> contextImpl(context).addPhaseCompletedListener(phase, phaseFin)); return phaseFin; @@ -125,7 +125,7 @@ final class ModifierImpl implements ModelActionBuilder { final ModelProcessingPhase phase) { checkNotRegistered(); - final PhaseModificationInNamespace mod = new PhaseModificationInNamespace<>(EFFECTIVE_MODEL); + final var mod = new PhaseModificationInNamespace(this, EFFECTIVE_MODEL); addReq(mod); addMutation(mod); contextImpl(context).onNamespaceItemAddedAction((ParserNamespace) namespace, key, mod); @@ -154,7 +154,7 @@ final class ModifierImpl implements ModelActionBuilder { @Override public , T extends C> Prerequisite mutatesCtx(final T context, final ModelProcessingPhase phase) { - return addMutation(new PhaseMutation<>(contextImpl(context), phase)); + return addMutation(new PhaseMutation<>(this, contextImpl(context), phase)); } @Override @@ -182,7 +182,7 @@ final class ModifierImpl implements ModelActionBuilder { final ParserNamespace namespace, final Iterable keys, final ModelProcessingPhase phase) { checkNotRegistered(); - final var ret = new PhaseRequirementInNamespacePath(EFFECTIVE_MODEL, keys); + final var ret = new PhaseRequirementInNamespacePath(this, EFFECTIVE_MODEL, keys); addReq(ret); addBootstrap(() -> ret.hookOnto(context, namespace)); return ret; @@ -233,7 +233,7 @@ final class ModifierImpl implements ModelActionBuilder { @Deprecated public Prerequisite> mutatesNs(final Mutable context, final ParserNamespace namespace) { - return addMutation(new NamespaceMutation(contextImpl(context), namespace)); + return addMutation(new NamespaceMutation(this, contextImpl(context), namespace)); } @Override @@ -249,7 +249,7 @@ final class ModifierImpl implements ModelActionBuilder { final Iterable keys) { checkNotRegistered(); - final var ret = new PhaseModificationInNamespacePath, K>(EFFECTIVE_MODEL, keys); + final var ret = new PhaseModificationInNamespacePath, K>(this, EFFECTIVE_MODEL, keys); addReq(ret); addMutation(ret); addBootstrap(() -> ret.hookOnto(context, namespace)); @@ -274,15 +274,21 @@ final class ModifierImpl implements ModelActionBuilder { bootstraps.add(bootstrap); } - private abstract class AbstractPrerequisite implements Prerequisite { + private abstract static class AbstractPrerequisite implements Prerequisite { + final @NonNull ModifierImpl modifier; + private boolean done = false; private T value; + AbstractPrerequisite(final ModifierImpl modifier) { + this.modifier = requireNonNull(modifier); + } + @Override @SuppressWarnings("checkstyle:hiddenField") public final T resolve(final InferenceContext ctx) { checkState(done); - checkArgument(ctx == ModifierImpl.this.ctx); + checkArgument(ctx == modifier.ctx); return verifyNotNull(value, "Attempted to access unavailable prerequisite %s", this); } @@ -294,7 +300,7 @@ final class ModifierImpl implements ModelActionBuilder { final boolean resolvePrereq(final T value) { this.value = value; this.done = true; - return isApplied(); + return modifier.isApplied(); } final @NonNull Prerequisite transform(final Function transformation) { @@ -311,13 +317,15 @@ final class ModifierImpl implements ModelActionBuilder { } } - private abstract class AbstractPathPrerequisite, K> extends AbstractPrerequisite - implements OnNamespaceItemAdded { + private abstract static class AbstractPathPrerequisite, K> + extends AbstractPrerequisite implements OnNamespaceItemAdded { private final ModelProcessingPhase modPhase; private final Iterable keys; private final Iterator it; - AbstractPathPrerequisite(final ModelProcessingPhase phase, final Iterable keys) { + AbstractPathPrerequisite(final ModifierImpl modifier, final ModelProcessingPhase phase, + final Iterable keys) { + super(modifier); this.modPhase = requireNonNull(phase); this.keys = requireNonNull(keys); it = keys.iterator(); @@ -332,7 +340,7 @@ final class ModifierImpl implements ModelActionBuilder { if (!target.isSupportedByFeatures()) { LOG.debug("Key {} in {} is not supported", key, keys); resolvePrereq(null); - action.prerequisiteUnavailable(this); + modifier.action.prerequisiteUnavailable(this); return; } @@ -341,7 +349,7 @@ final class ModifierImpl implements ModelActionBuilder { if (!it.hasNext()) { // Last step: we are done if (resolvePrereq((C) value)) { - tryApply(); + modifier.tryApply(); } return; } @@ -370,40 +378,49 @@ final class ModifierImpl implements ModelActionBuilder { } } - private final class PhaseMutation extends AbstractPrerequisite implements ContextMutation { + private static final class PhaseMutation extends AbstractPrerequisite implements ContextMutation { @SuppressWarnings("unchecked") - PhaseMutation(final StatementContextBase context, final ModelProcessingPhase phase) { + PhaseMutation(final ModifierImpl modifier, final StatementContextBase context, + final ModelProcessingPhase phase) { + super(modifier); context.addMutation(phase, this); resolvePrereq((C) context); } @Override public boolean isFinished() { - return isApplied(); + return modifier.isApplied(); } } - private final class PhaseFinished> extends AbstractPrerequisite + private static final class PhaseFinished> extends AbstractPrerequisite implements OnPhaseFinished { + PhaseFinished(final ModifierImpl modifier) { + super(modifier); + } + @SuppressWarnings("unchecked") @Override public boolean phaseFinished(final StatementContextBase context, final ModelProcessingPhase finishedPhase) { - return resolvePrereq((C) context) || tryApply(); + return resolvePrereq((C) context) || modifier.tryApply(); } } - private final class NamespaceMutation extends AbstractPrerequisite> { - NamespaceMutation(final StatementContextBase ctx, final ParserNamespace namespace) { + private static final class NamespaceMutation extends AbstractPrerequisite> { + NamespaceMutation(final ModifierImpl modifier, final StatementContextBase ctx, + final ParserNamespace namespace) { + super(modifier); resolvePrereq(ctx); } } - private final class AddedToNamespace> extends AbstractPrerequisite + private static final class AddedToNamespace> extends AbstractPrerequisite implements OnNamespaceItemAdded, OnPhaseFinished { private final ModelProcessingPhase phase; - AddedToNamespace(final ModelProcessingPhase phase) { + AddedToNamespace(final ModifierImpl modifier, final ModelProcessingPhase phase) { + super(modifier); this.phase = requireNonNull(phase); } @@ -417,7 +434,7 @@ final class ModifierImpl implements ModelActionBuilder { @Override public boolean phaseFinished(final StatementContextBase context, final ModelProcessingPhase finishedPhase) { - return resolvePrereq((C) context) || tryApply(); + return resolvePrereq((C) context) || modifier.tryApply(); } @Override @@ -426,10 +443,11 @@ final class ModifierImpl implements ModelActionBuilder { } } - private final class PhaseRequirementInNamespacePath, K> + private static final class PhaseRequirementInNamespacePath, K> extends AbstractPathPrerequisite { - PhaseRequirementInNamespacePath(final ModelProcessingPhase phase, final Iterable keys) { - super(phase, keys); + PhaseRequirementInNamespacePath(final ModifierImpl modifier, final ModelProcessingPhase phase, + final Iterable keys) { + super(modifier, phase, keys); } @Override @@ -439,11 +457,12 @@ final class ModifierImpl implements ModelActionBuilder { } } - private final class PhaseModificationInNamespace> extends AbstractPrerequisite + private static final class PhaseModificationInNamespace> extends AbstractPrerequisite implements OnNamespaceItemAdded, ContextMutation { private final ModelProcessingPhase modPhase; - PhaseModificationInNamespace(final ModelProcessingPhase phase) { + PhaseModificationInNamespace(final ModifierImpl modifier, final ModelProcessingPhase phase) { + super(modifier); checkArgument(phase != null, "Model processing phase must not be null"); this.modPhase = phase; } @@ -459,7 +478,7 @@ final class ModifierImpl implements ModelActionBuilder { @Override public boolean isFinished() { - return isApplied(); + return modifier.isApplied(); } } @@ -468,15 +487,16 @@ final class ModifierImpl implements ModelActionBuilder { * target. The mechanics is driven as a sequence of prerequisites along a path: first we hook onto namespace to * give us the first step. When it does, we hook onto the first item to provide us the second step and so on. */ - private final class PhaseModificationInNamespacePath, K> + private static final class PhaseModificationInNamespacePath, K> extends AbstractPathPrerequisite implements ContextMutation { - PhaseModificationInNamespacePath(final ModelProcessingPhase phase, final Iterable keys) { - super(phase, keys); + PhaseModificationInNamespacePath(final ModifierImpl modifier, final ModelProcessingPhase phase, + final Iterable keys) { + super(modifier, phase, keys); } @Override public boolean isFinished() { - return isApplied(); + return modifier.isApplied(); } @Override