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.

Reply via email to