X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2FExtensionStatementImpl.java;h=f9ec24290d8b117e56292ddeafd2556e0a18be12;hb=07a461a735316f15f9a78455e1c1c3caf91b2a3e;hp=74c6e67cb20c5783e61260090bbd37aa621f8fb5;hpb=de990fa7c7840a1ac964a48f00aff1358eaec562;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java index 74c6e67cb2..f9ec24290d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java @@ -7,8 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import java.util.HashSet; -import java.util.Set; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -39,8 +37,6 @@ public class ExtensionStatementImpl extends AbstractDeclaredStatement imp } public static class Definition extends AbstractStatementSupport> { - private static final ThreadLocal>> BUILDING = new ThreadLocal<>(); - public Definition() { super(Rfc6020Mapping.EXTENSION); } @@ -57,24 +53,22 @@ public class ExtensionStatementImpl extends AbstractDeclaredStatement imp @Override public EffectiveStatement createEffective( - final StmtContext> ctx) { - Set> building = BUILDING.get(); - if (building == null) { - building = new HashSet<>(); - BUILDING.set(building); + final StmtContext> ctx) { + + // Look at the thread-local leak in case we are invoked recursively + final ExtensionEffectiveStatementImpl existing = RecursiveObjectLeaker.lookup(ctx, + ExtensionEffectiveStatementImpl.class); + if (existing != null) { + // Careful! this not fully initialized! + return existing; } - SourceException.throwIf(building.contains(ctx), ctx.getStatementSourceReference(), - "Extension %s references itself", ctx.getStatementArgument()); - - building.add(ctx); + RecursiveObjectLeaker.beforeConstructor(ctx); try { + // This result is fine, we know it has been completely initialized return new ExtensionEffectiveStatementImpl(ctx); } finally { - building.remove(ctx); - if (building.isEmpty()) { - BUILDING.remove(); - } + RecursiveObjectLeaker.afterConstructor(ctx); } }