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;