This is an automated email from the ASF dual-hosted git repository.

mattsicker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new 7e2716b42b Use lazy values for safer publication of thread context 
changes
7e2716b42b is described below

commit 7e2716b42b5b557ab2745dc7e2fe7e91fff78c2c
Author: Matt Sicker <[email protected]>
AuthorDate: Sat Nov 12 19:14:45 2022 -0600

    Use lazy values for safer publication of thread context changes
    
    Signed-off-by: Matt Sicker <[email protected]>
---
 .../apache/logging/log4j/spi/LoggingSystem.java    | 30 +++++++++++-----------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggingSystem.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggingSystem.java
index 1228d030a5..6d98c42932 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggingSystem.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggingSystem.java
@@ -72,7 +72,8 @@ public class LoggingSystem {
     private final Lock initializationLock = new ReentrantLock();
     private volatile SystemProvider provider;
     private final Lazy<PropertyEnvironment> environmentLazy = 
Lazy.relaxed(PropertiesUtil::getProperties);
-    private final Lazy<LoggerContextFactory> loggerContextFactoryLazy = 
Lazy.lazy(() -> getProvider().createLoggerContextFactory());
+    private final Lazy<LoggerContextFactory> loggerContextFactoryLazy = 
environmentLazy.map(environment ->
+            getProvider().createLoggerContextFactory(environment));
     private final Lazy<MessageFactory> messageFactoryLazy = 
environmentLazy.map(environment -> {
         final String className = 
environment.getStringProperty(LOGGER_MESSAGE_FACTORY_CLASS);
         if (className != null) {
@@ -93,8 +94,10 @@ public class LoggingSystem {
         }
         return new DefaultFlowMessageFactory();
     });
-    private Supplier<ThreadContextMap> threadContextMapSupplier = () -> 
getProvider().createContextMap();
-    private Supplier<ThreadContextStack> threadContextStackSupplier = () -> 
getProvider().createContextStack();
+    private final Lazy<Supplier<ThreadContextMap>> threadContextMapFactoryLazy 
= environmentLazy.map(environment ->
+            () -> getProvider().createContextMap(environment));
+    private final Lazy<Supplier<ThreadContextStack>> 
threadContextStackFactoryLazy = environmentLazy.map(environment ->
+            () -> getProvider().createContextStack(environment));
 
     /**
      * Acquires a lock on the initialization of locating a logging system 
provider. This lock should be
@@ -164,12 +167,12 @@ public class LoggingSystem {
         flowMessageFactoryLazy.set(flowMessageFactory);
     }
 
-    public void setThreadContextMapSupplier(final Supplier<ThreadContextMap> 
threadContextMapSupplier) {
-        this.threadContextMapSupplier = threadContextMapSupplier;
+    public void setThreadContextMapFactory(final Supplier<ThreadContextMap> 
threadContextMapFactory) {
+        threadContextMapFactoryLazy.set(threadContextMapFactory);
     }
 
-    public void setThreadContextStackSupplier(final 
Supplier<ThreadContextStack> threadContextStackSupplier) {
-        this.threadContextStackSupplier = threadContextStackSupplier;
+    public void setThreadContextStackFactory(final 
Supplier<ThreadContextStack> threadContextStackFactory) {
+        threadContextStackFactoryLazy.set(threadContextStackFactory);
     }
 
     /**
@@ -199,14 +202,14 @@ public class LoggingSystem {
      * Creates a new ThreadContextMap.
      */
     public static ThreadContextMap createContextMap() {
-        return getInstance().threadContextMapSupplier.get();
+        return getInstance().threadContextMapFactoryLazy.value().get();
     }
 
     /**
      * Creates a new ThreadContextStack.
      */
     public static ThreadContextStack createContextStack() {
-        return getInstance().threadContextStackSupplier.get();
+        return getInstance().threadContextStackFactoryLazy.value().get();
     }
 
     private static List<Provider> loadDefaultProviders() {
@@ -295,8 +298,7 @@ public class LoggingSystem {
             this.provider = provider;
         }
 
-        public LoggerContextFactory createLoggerContextFactory() {
-            final PropertyEnvironment environment = 
PropertiesUtil.getProperties();
+        public LoggerContextFactory createLoggerContextFactory(final 
PropertyEnvironment environment) {
             final String customFactoryClass = 
environment.getStringProperty(LogManager.FACTORY_PROPERTY_NAME);
             if (customFactoryClass != null) {
                 final LoggerContextFactory customFactory = 
createInstance(customFactoryClass, LoggerContextFactory.class);
@@ -339,8 +341,7 @@ public class LoggingSystem {
          * @see ReadOnlyThreadContextMap
          * @see org.apache.logging.log4j.ThreadContext
          */
-        public ThreadContextMap createContextMap() {
-            final PropertyEnvironment environment = 
PropertiesUtil.getProperties();
+        public ThreadContextMap createContextMap(final PropertyEnvironment 
environment) {
             final String customThreadContextMap = 
environment.getStringProperty(THREAD_CONTEXT_MAP_CLASS);
             if (customThreadContextMap != null) {
                 final ThreadContextMap customContextMap = 
createInstance(customThreadContextMap, ThreadContextMap.class);
@@ -374,8 +375,7 @@ public class LoggingSystem {
             return new DefaultThreadContextMap(true, inheritableMap);
         }
 
-        public ThreadContextStack createContextStack() {
-            final PropertyEnvironment environment = 
PropertiesUtil.getProperties();
+        public ThreadContextStack createContextStack(final PropertyEnvironment 
environment) {
             final boolean disableStack = 
environment.getBooleanProperty(THREAD_CONTEXT_STACK_DISABLED,
                     environment.getBooleanProperty(THREAD_CONTEXT_DISABLED));
             return new DefaultThreadContextStack(!disableStack);

Reply via email to