diff --git a/vertx-core/src/main/java/io/vertx/core/impl/LocalSeq.java b/vertx-core/src/main/java/io/vertx/core/impl/LocalSeq.java index 17eff10fa25..b4ade7f8e29 100644 --- a/vertx-core/src/main/java/io/vertx/core/impl/LocalSeq.java +++ b/vertx-core/src/main/java/io/vertx/core/impl/LocalSeq.java @@ -15,7 +15,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; /** * @author Julien Viet @@ -38,7 +37,11 @@ public synchronized static void reset() { locals.add(ContextInternal.LOCAL_MAP); } - synchronized static ContextLocal[] get() { + synchronized static ContextLocal[] getArray() { return locals.toArray(new ContextLocal[0]); } + + synchronized static List> getList() { + return List.copyOf(locals); + } } diff --git a/vertx-core/src/main/java/io/vertx/core/impl/VertxImpl.java b/vertx-core/src/main/java/io/vertx/core/impl/VertxImpl.java index e617d9d2dac..dbc974f09c2 100644 --- a/vertx-core/src/main/java/io/vertx/core/impl/VertxImpl.java +++ b/vertx-core/src/main/java/io/vertx/core/impl/VertxImpl.java @@ -150,8 +150,6 @@ private static ThreadFactory virtualThreadFactory() { private final FileResolver fileResolver; private final EventExecutorProvider eventExecutorProvider; private final Map sharedNetServers = new HashMap<>(); - private final ContextLocal[] contextLocals; - private final List> contextLocalsList; final WorkerPool workerPool; final WorkerPool internalWorkerPool; final WorkerPool virtualThreadWorkerPool; @@ -211,8 +209,6 @@ private static ThreadFactory virtualThreadFactory() { ThreadFactory virtualThreadFactory = virtualThreadFactory(); PoolMetrics virtualThreadWorkerPoolMetrics = metrics != null && virtualThreadFactory != null ? metrics.createPoolMetrics("worker", "vert.x-virtual-thread", -1) : null; - contextLocals = LocalSeq.get(); - contextLocalsList = Collections.unmodifiableList(Arrays.asList(contextLocals)); closeFuture = new CloseFuture(log); maxEventLoopExecTime = maxEventLoopExecuteTime; maxEventLoopExecTimeUnit = maxEventLoopExecuteTimeUnit; @@ -619,6 +615,7 @@ public boolean cancelTimer(long id) { } private Object[] createContextLocals() { + ContextLocal[] contextLocals = LocalSeq.getArray(); if (contextLocals.length == 0) { return EMPTY_CONTEXT_LOCALS; } else { @@ -951,7 +948,7 @@ public NameResolver nameResolver() { @Override public List> contextLocals() { - return contextLocalsList; + return LocalSeq.getList(); } @Override @@ -1340,6 +1337,7 @@ public C createSharedResource(String resourceKey, String resourceName, Close } void duplicate(ContextBase src, ContextBase dst) { + ContextLocal[] contextLocals = LocalSeq.getArray(); for (int i = 0;i < contextLocals.length;i++) { ContextLocalImpl contextLocal = (ContextLocalImpl) contextLocals[i]; Object local = AccessMode.CONCURRENT.get(src.locals, i); diff --git a/vertx-core/src/test/java/io/vertx/tests/context/ContextTest.java b/vertx-core/src/test/java/io/vertx/tests/context/ContextTest.java index d3824bdd1a3..d40f2cc6ee2 100644 --- a/vertx-core/src/test/java/io/vertx/tests/context/ContextTest.java +++ b/vertx-core/src/test/java/io/vertx/tests/context/ContextTest.java @@ -1242,7 +1242,10 @@ public void testContextLocals() { List> locals = ((VertxInternal) vertx).contextLocals(); assertSame(ContextInternal.LOCAL_MAP, locals.get(0)); assertSame(contextLocal, locals.get(1)); - assertSame(locals, ((VertxInternal) vertx).contextLocals()); + List> localsAgain = ((VertxInternal) vertx).contextLocals(); + assertNotSame(locals, localsAgain); + assertSame(ContextInternal.LOCAL_MAP, localsAgain.get(0)); + assertSame(contextLocal, localsAgain.get(1)); } @Test