From 36bc792951e232b153903c9931e3c4ed3c2bf70e Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Wed, 3 Dec 2025 12:17:29 +0100 Subject: [PATCH] Possibly use a fast path for accessing scope stacks --- .../scopemanager/ContinuableScopeManager.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java index 6e26ebfcf07..6c9a4b7a06c 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java @@ -391,6 +391,8 @@ public Context swap(Context context) { static final class ScopeStackThreadLocal extends ThreadLocal { + private final ScopeStack[] fastStacks = new ScopeStack[2048]; // This should be tuned + private final ProfilingContextIntegration profilingContextIntegration; ScopeStackThreadLocal(ProfilingContextIntegration profilingContextIntegration) { @@ -401,6 +403,41 @@ static final class ScopeStackThreadLocal extends ThreadLocal { protected ScopeStack initialValue() { return new ScopeStack(profilingContextIntegration); } + + @Override + public ScopeStack get() { + final long id = Thread.currentThread().getId(); + if (id >= 0 && id < this.fastStacks.length) { + ScopeStack ret = fastStacks[(int) id]; + if (ret == null) { + ret = initialValue(); + fastStacks[(int) id] = ret; + } + return ret; + } else { + return super.get(); + } + } + + @Override + public void set(ScopeStack value) { + final long id = Thread.currentThread().getId(); + if (id >= 0 && id < this.fastStacks.length) { + fastStacks[(int) id] = value; + } else { + super.set(value); + } + } + + @Override + public void remove() { + final long id = Thread.currentThread().getId(); + if (id >= 0 && id < this.fastStacks.length) { + fastStacks[(int) id] = null; + } else { + super.remove(); + } + } } private void scheduleRootIterationScopeCleanup(ScopeStack scopeStack, ContinuableScope scope) {