You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2022/01/08 16:08:53 UTC
[logging-log4j2] 01/02: Replace internal use of synchronized java.util.Stack with unsynchronized java.util.Deque. These objects are not shared between threads.
This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 97f3153b73ab071a69c2e61e0130fd0104d45407
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sat Jan 8 11:08:40 2022 -0500
Replace internal use of synchronized java.util.Stack with unsynchronized
java.util.Deque. These objects are not shared between threads.
Split commit for cherry-picking to master.
---
log4j-api/revapi.json | 1 +
.../log4j/util/PrivateSecurityManagerStackTraceUtil.java | 8 ++++----
.../java/org/apache/logging/log4j/util/StackLocator.java | 7 ++++---
.../java/org/apache/logging/log4j/util/StackLocatorUtil.java | 4 ++--
.../org/apache/logging/log4j/core/impl/ThrowableProxy.java | 6 +++---
.../apache/logging/log4j/core/impl/ThrowableProxyHelper.java | 12 ++++++------
6 files changed, 20 insertions(+), 18 deletions(-)
diff --git a/log4j-api/revapi.json b/log4j-api/revapi.json
index d362403..3a920d2 100644
--- a/log4j-api/revapi.json
+++ b/log4j-api/revapi.json
@@ -10,6 +10,7 @@
"org\\.apache\\.logging\\.log4j\\.util\\.PrivateSecurityManagerStackTraceUtil",
"org\\.apache\\.logging\\.log4j\\.util\\.PropertiesUtil",
"org\\.apache\\.logging\\.log4j\\.util\\.ProviderUtil",
+ "org\\.apache\\.logging\\.log4j\\.util\\.StackLocator",
"org\\.apache\\.logging\\.log4j\\.util\\.StackLocatorUtil"
]
}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java
index 51bca15..d8852aa 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java
@@ -16,7 +16,8 @@
*/
package org.apache.logging.log4j.util;
-import java.util.Stack;
+import java.util.ArrayDeque;
+import java.util.Deque;
/**
* Internal utility to share a fast implementation of {@link #getCurrentStackTrace()}
@@ -50,10 +51,9 @@ final class PrivateSecurityManagerStackTraceUtil {
}
// benchmarks show that using the SecurityManager is much faster than looping through getCallerClass(int)
- static Stack<Class<?>> getCurrentStackTrace() {
+ static Deque<Class<?>> getCurrentStackTrace() {
final Class<?>[] array = SECURITY_MANAGER.getClassContext();
- final Stack<Class<?>> classes = new Stack<>();
- classes.ensureCapacity(array.length);
+ final Deque<Class<?>> classes = new ArrayDeque<>(array.length);
for (final Class<?> clazz : array) {
classes.push(clazz);
}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
index 495b66f..44bfafa 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
@@ -17,7 +17,8 @@
package org.apache.logging.log4j.util;
import java.lang.reflect.Method;
-import java.util.Stack;
+import java.util.ArrayDeque;
+import java.util.Deque;
import java.util.function.Predicate;
/**
@@ -193,13 +194,13 @@ public final class StackLocator {
// migrated from ThrowableProxy
@PerformanceSensitive
- public Stack<Class<?>> getCurrentStackTrace() {
+ public Deque<Class<?>> getCurrentStackTrace() {
// benchmarks show that using the SecurityManager is much faster than looping through getCallerClass(int)
if (PrivateSecurityManagerStackTraceUtil.isEnabled()) {
return PrivateSecurityManagerStackTraceUtil.getCurrentStackTrace();
}
// slower version using getCallerClass where we cannot use a SecurityManager
- final Stack<Class<?>> classes = new Stack<>();
+ final Deque<Class<?>> classes = new ArrayDeque<>();
Class<?> clazz;
for (int i = 1; null != (clazz = getCallerClass(i)); i++) {
classes.push(clazz);
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocatorUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocatorUtil.java
index 6f8a388..f9fb1b4 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocatorUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocatorUtil.java
@@ -16,8 +16,8 @@
*/
package org.apache.logging.log4j.util;
+import java.util.Deque;
import java.util.NoSuchElementException;
-import java.util.Stack;
import java.util.function.Predicate;
import org.apache.logging.log4j.status.StatusLogger;
@@ -112,7 +112,7 @@ public final class StackLocatorUtil {
// migrated from ThrowableProxy
@PerformanceSensitive
- public static Stack<Class<?>> getCurrentStackTrace() {
+ public static Deque<Class<?>> getCurrentStackTrace() {
return stackLocator.getCurrentStackTrace();
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
index e63fb63..bd10224 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
@@ -18,13 +18,13 @@ package org.apache.logging.log4j.core.impl;
import java.io.Serializable;
import java.util.Arrays;
+import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import java.util.Stack;
import org.apache.logging.log4j.core.pattern.PlainTextRenderer;
import org.apache.logging.log4j.core.pattern.TextRenderer;
@@ -108,7 +108,7 @@ public class ThrowableProxy implements Serializable {
this.message = throwable.getMessage();
this.localizedMessage = throwable.getLocalizedMessage();
final Map<String, ThrowableProxyHelper.CacheEntry> map = new HashMap<>();
- final Stack<Class<?>> stack = StackLocatorUtil.getCurrentStackTrace();
+ final Deque<Class<?>> stack = StackLocatorUtil.getCurrentStackTrace();
this.extendedStackTrace = ThrowableProxyHelper.toExtendedStackTrace(this, stack, map, null, throwable.getStackTrace());
final Throwable throwableCause = throwable.getCause();
final Set<Throwable> causeVisited = new HashSet<>(1);
@@ -127,7 +127,7 @@ public class ThrowableProxy implements Serializable {
* @param suppressedVisited TODO
* @param causeVisited TODO
*/
- private ThrowableProxy(final Throwable parent, final Stack<Class<?>> stack,
+ private ThrowableProxy(final Throwable parent, final Deque<Class<?>> stack,
final Map<String, ThrowableProxyHelper.CacheEntry> map,
final Throwable cause, final Set<Throwable> suppressedVisited,
final Set<Throwable> causeVisited) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxyHelper.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxyHelper.java
index 58f9d15..955bdd7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxyHelper.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxyHelper.java
@@ -16,18 +16,18 @@
*/
package org.apache.logging.log4j.core.impl;
-import org.apache.logging.log4j.core.util.Loader;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
-
import java.net.URL;
import java.security.CodeSource;
import java.util.ArrayList;
+import java.util.Deque;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.Stack;
+
+import org.apache.logging.log4j.core.util.Loader;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.LoaderUtil;
/**
* {@link ThrowableProxyHelper} provides utilities required to initialize a new {@link ThrowableProxy}
@@ -67,7 +67,7 @@ class ThrowableProxyHelper {
*/
static ExtendedStackTraceElement[] toExtendedStackTrace(
final ThrowableProxy src,
- final Stack<Class<?>> stack, final Map<String, CacheEntry> map,
+ final Deque<Class<?>> stack, final Map<String, CacheEntry> map,
final StackTraceElement[] rootTrace,
final StackTraceElement[] stackTrace) {
int stackLength;