LOG4J2-1349 select ThreadContextMap implementation based on system properties configuration
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/ca735dd9 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/ca735dd9 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/ca735dd9 Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext Commit: ca735dd963f81d69167c6d28c8e8f51154175f26 Parents: 8250cc2 Author: rpopma <[email protected]> Authored: Wed Aug 31 22:02:06 2016 +0900 Committer: rpopma <[email protected]> Committed: Wed Aug 31 22:02:06 2016 +0900 ---------------------------------------------------------------------- .../org/apache/logging/log4j/ThreadContext.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ca735dd9/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java index e0a88dc..0ca13ab 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java @@ -27,13 +27,16 @@ import java.util.Map; import java.util.NoSuchElementException; import org.apache.logging.log4j.message.ParameterizedMessage; +import org.apache.logging.log4j.spi.CopyOnWriteSortedArrayThreadContextMap; import org.apache.logging.log4j.spi.DefaultThreadContextMap; import org.apache.logging.log4j.spi.DefaultThreadContextStack; +import org.apache.logging.log4j.spi.GarbageFreeSortedArrayThreadContextMap; import org.apache.logging.log4j.spi.Provider; import org.apache.logging.log4j.spi.ThreadContextMap; import org.apache.logging.log4j.spi.ThreadContextMap2; import org.apache.logging.log4j.spi.ThreadContextStack; import org.apache.logging.log4j.status.StatusLogger; +import org.apache.logging.log4j.util.Constants; import org.apache.logging.log4j.util.PropertiesUtil; import org.apache.logging.log4j.util.ProviderUtil; @@ -190,6 +193,7 @@ public final class ThreadContext { private static final String DISABLE_STACK = "disableThreadContextStack"; private static final String DISABLE_ALL = "disableThreadContext"; private static final String THREAD_CONTEXT_KEY = "log4j2.threadContextMap"; + private static final String GC_FREE_THREAD_CONTEXT_KEY = "log4j2.garbagefree.threadContextMap"; private static boolean disableAll; private static boolean useMap; @@ -243,17 +247,27 @@ public final class ThreadContext { } catch (final Exception e) { LOGGER.error("Unable to locate or load configured ThreadContextMap {}", provider.getThreadContextMap(), e); - contextMap = new DefaultThreadContextMap(useMap); + contextMap = createThreadContextMap(useMap); } } } } } if (contextMap == null) { - contextMap = new DefaultThreadContextMap(useMap); + contextMap = createThreadContextMap(useMap); } } + private static ThreadContextMap createThreadContextMap(final boolean doUseMap) { + if (Constants.ENABLE_THREADLOCALS) { + if (PropertiesUtil.getProperties().getBooleanProperty(GC_FREE_THREAD_CONTEXT_KEY)) { + return new GarbageFreeSortedArrayThreadContextMap(); + } + return new CopyOnWriteSortedArrayThreadContextMap(); + } + return new DefaultThreadContextMap(doUseMap); + } + /** * Puts a context value (the <code>value</code> parameter) as identified with the <code>key</code> parameter into * the current thread's context map.
