X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fmdsal-trace%2Fdom-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Ftrace%2Fclosetracker%2Fimpl%2FCloseTrackedTrait.java;h=f96daaa425566f328540b1268f95ae1af08bd798;hb=refs%2Fchanges%2F11%2F80211%2F6;hp=b846c042d192e831bc67b8eca223c3a275b919de;hpb=c2b97e243117918acf5aa77d58ad5dc25d32c105;p=controller.git diff --git a/opendaylight/md-sal/mdsal-trace/dom-impl/src/main/java/org/opendaylight/controller/md/sal/trace/closetracker/impl/CloseTrackedTrait.java b/opendaylight/md-sal/mdsal-trace/dom-impl/src/main/java/org/opendaylight/controller/md/sal/trace/closetracker/impl/CloseTrackedTrait.java index b846c042d1..f96daaa425 100644 --- a/opendaylight/md-sal/mdsal-trace/dom-impl/src/main/java/org/opendaylight/controller/md/sal/trace/closetracker/impl/CloseTrackedTrait.java +++ b/opendaylight/md-sal/mdsal-trace/dom-impl/src/main/java/org/opendaylight/controller/md/sal/trace/closetracker/impl/CloseTrackedTrait.java @@ -7,8 +7,10 @@ */ package org.opendaylight.controller.md.sal.trace.closetracker.impl; -import java.util.Objects; -import javax.annotation.Nullable; +import static java.util.Objects.requireNonNull; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.eclipse.jdt.annotation.Nullable; /** * Implementation of {@link CloseTracked} which can be used as a field in @@ -22,20 +24,30 @@ import javax.annotation.Nullable; */ public class CloseTrackedTrait> implements CloseTracked { + // NB: It's important that we keep a Throwable here, and not directly the StackTraceElement[] ! + // This is because creating a new Throwable() is a lot less expensive in terms of runtime overhead + // than actually calling its getStackTrace(), which we can delay until we really need to. + // see also e.g. https://stackoverflow.com/a/26122232/421602 private final @Nullable Throwable allocationContext; private final CloseTrackedRegistry closeTrackedRegistry; + private final CloseTracked realCloseTracked; - public CloseTrackedTrait(CloseTrackedRegistry transactionChainRegistry) { + @SuppressFBWarnings(value = "NP_STORE_INTO_NONNULL_FIELD", justification = "SpotBugs and JDT annotations") + public CloseTrackedTrait(CloseTrackedRegistry transactionChainRegistry, CloseTracked realCloseTracked) { if (transactionChainRegistry.isDebugContextEnabled()) { - this.allocationContext = new Throwable("allocated at"); + // NB: We're NOT doing the (expensive) getStackTrace() here just yet (only below) + // TODO When we're on Java 9, then instead use the new java.lang.StackWalker API.. + this.allocationContext = new Throwable(); } else { this.allocationContext = null; } - this.closeTrackedRegistry = Objects.requireNonNull(transactionChainRegistry, "transactionChainRegistry"); + this.realCloseTracked = requireNonNull(realCloseTracked, "realCloseTracked"); + this.closeTrackedRegistry = requireNonNull(transactionChainRegistry, "transactionChainRegistry"); this.closeTrackedRegistry.add(this); } @Override + @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") public StackTraceElement[] getAllocationContextStackTrace() { return allocationContext != null ? allocationContext.getStackTrace() : null; } @@ -44,4 +56,9 @@ public class CloseTrackedTrait> implements CloseTracke closeTrackedRegistry.remove(this); } + @Override + public CloseTracked getRealCloseTracked() { + return realCloseTracked; + } + }