You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2020/02/23 06:29:55 UTC

[logging-log4j2] branch release-2.x updated: LOG4J2-2756 - Prevent LoggerContext from being garbage collected while being created.

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

rgoers pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new 1482062  LOG4J2-2756 - Prevent LoggerContext from being garbage collected while being created.
1482062 is described below

commit 1482062a163734a63de176a69cff8ad71f5ed468
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Sat Feb 22 23:16:25 2020 -0700

    LOG4J2-2756 - Prevent LoggerContext from being garbage collected while being created.
---
 .../log4j/core/selector/ClassLoaderContextSelector.java      | 12 +++++++-----
 src/changes/changes.xml                                      |  3 +++
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
index 71217c0..f8a5e9d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.core.selector;
 
+import java.lang.ref.Reference;
 import java.lang.ref.WeakReference;
 import java.net.URI;
 import java.util.ArrayList;
@@ -203,11 +204,12 @@ public class ClassLoaderContextSelector implements ContextSelector, LoggerContex
                 }
             }
             LoggerContext ctx = createContext(name, configLocation);
-            final AtomicReference<WeakReference<LoggerContext>> r = new AtomicReference<>();
-            r.set(new WeakReference<>(ctx));
-            CONTEXT_MAP.putIfAbsent(name, r);
-            ctx = CONTEXT_MAP.get(name).get().get();
-            return ctx;
+            LoggerContext newContext = CONTEXT_MAP.computeIfAbsent(name,
+                    k -> new AtomicReference<>(new WeakReference<>(ctx))).get().get();
+            if (newContext == ctx) {
+                ctx.addShutdownListener(this);
+            }
+            return newContext;
         }
         final WeakReference<LoggerContext> weakRef = ref.get();
         LoggerContext ctx = weakRef.get();
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 080bb35..ff9e926 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -30,6 +30,9 @@
          - "remove" - Removed
     -->
     <release version="2.13.1" date="2019-MM-DD" description="GA Release 2.13.1">
+      <action issue="LOG4J2-2756" dev="rgoers" type="fix">
+        Prevent LoggerContext from being garbage collected while being created.
+      </action>
       <action issue="LOG4J2-2769" dev="rgoers" type="fix">
         Do not log an error if Files.move does not work.
       </action>