diff --git a/src/main/java/io/vertx/core/impl/ContextImpl.java b/src/main/java/io/vertx/core/impl/ContextImpl.java index 173cd77717b..6fdf1b57263 100644 --- a/src/main/java/io/vertx/core/impl/ContextImpl.java +++ b/src/main/java/io/vertx/core/impl/ContextImpl.java @@ -44,7 +44,6 @@ public final class ContextImpl extends ContextBase implements ContextInternal { private final EventLoop eventLoop; private final EventExecutor executor; private ConcurrentMap data; - private ConcurrentMap localData; private volatile Handler exceptionHandler; final TaskQueue internalOrderedTasks; final WorkerPool internalWorkerPool; @@ -213,14 +212,6 @@ public synchronized ConcurrentMap contextData() { return data; } - @Override - public synchronized ConcurrentMap localContextData() { - if (localData == null) { - localData = new ConcurrentHashMap<>(); - } - return localData; - } - public void reportException(Throwable t) { Handler handler = exceptionHandler; if (handler == null) { diff --git a/src/main/java/io/vertx/core/impl/ContextInternal.java b/src/main/java/io/vertx/core/impl/ContextInternal.java index 2db8bfc13e4..990815c9490 100644 --- a/src/main/java/io/vertx/core/impl/ContextInternal.java +++ b/src/main/java/io/vertx/core/impl/ContextInternal.java @@ -14,6 +14,7 @@ import io.netty.channel.EventLoop; import io.vertx.codegen.annotations.GenIgnore; import io.vertx.core.*; +import io.vertx.core.Future; import io.vertx.core.impl.future.FailedFuture; import io.vertx.core.impl.future.PromiseImpl; import io.vertx.core.impl.future.PromiseInternal; @@ -22,10 +23,7 @@ import io.vertx.core.spi.context.locals.ContextKey; import io.vertx.core.spi.tracing.VertxTracer; -import java.util.concurrent.Callable; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import java.util.function.Supplier; /** @@ -37,6 +35,8 @@ */ public interface ContextInternal extends Context { + ContextKey> LOCAL_MAP = new ContextKeyImpl<>(0); + /** * @return the current context */ @@ -308,7 +308,9 @@ default boolean remove(Object key) { /** * @return the {@link ConcurrentMap} used to store local context data */ - ConcurrentMap localContextData(); + default ConcurrentMap localContextData() { + return getLocal(LOCAL_MAP, ConcurrentHashMap::new); + } /** * Get some local data from the context. diff --git a/src/main/java/io/vertx/core/impl/ContextKeyImpl.java b/src/main/java/io/vertx/core/impl/ContextKeyImpl.java index d0e3c5d7d53..58151d189f9 100644 --- a/src/main/java/io/vertx/core/impl/ContextKeyImpl.java +++ b/src/main/java/io/vertx/core/impl/ContextKeyImpl.java @@ -17,8 +17,13 @@ */ public class ContextKeyImpl implements ContextKey { - final int index = KeySeq.next(); + final int index; + + public ContextKeyImpl(int index) { + this.index = index; + } public ContextKeyImpl() { + this.index = KeySeq.next(); } } diff --git a/src/main/java/io/vertx/core/impl/DuplicatedContext.java b/src/main/java/io/vertx/core/impl/DuplicatedContext.java index 389685648d1..292d2da0b16 100644 --- a/src/main/java/io/vertx/core/impl/DuplicatedContext.java +++ b/src/main/java/io/vertx/core/impl/DuplicatedContext.java @@ -36,8 +36,7 @@ */ final class DuplicatedContext extends ContextBase implements ContextInternal { - protected final ContextImpl delegate; - private ConcurrentMap localData; + final ContextImpl delegate; DuplicatedContext(ContextImpl delegate, Object[] locals) { super(locals); @@ -120,16 +119,6 @@ public final ConcurrentMap contextData() { return delegate.contextData(); } - @Override - public final ConcurrentMap localContextData() { - synchronized (this) { - if (localData == null) { - localData = new ConcurrentHashMap<>(); - } - return localData; - } - } - @Override public Future executeBlockingInternal(Callable action) { return ContextImpl.executeBlocking(this, action, delegate.internalWorkerPool, delegate.internalOrderedTasks); diff --git a/src/main/java/io/vertx/core/impl/KeySeq.java b/src/main/java/io/vertx/core/impl/KeySeq.java index a4ff0a9d4ea..ff0ea2a51d7 100644 --- a/src/main/java/io/vertx/core/impl/KeySeq.java +++ b/src/main/java/io/vertx/core/impl/KeySeq.java @@ -17,13 +17,14 @@ */ class KeySeq { + // 0 : reserved slot for local context map private static final AtomicInteger seq = new AtomicInteger(); /** * Hook for testing purposes */ static void reset() { - seq.set((0)); + seq.set((1)); } static int get() { diff --git a/src/test/java/io/vertx/core/FakeContext.java b/src/test/java/io/vertx/core/FakeContext.java index 294b1e5a39a..75b5cc860d8 100644 --- a/src/test/java/io/vertx/core/FakeContext.java +++ b/src/test/java/io/vertx/core/FakeContext.java @@ -137,11 +137,6 @@ public ConcurrentMap contextData() { return null; } - @Override - public ConcurrentMap localContextData() { - return null; - } - @Override public ClassLoader classLoader() { return tccl;