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>