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

vy pushed a commit to branch recycler-api-3.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 21abf71034d6f936f25ae126f43d4caddc266632
Author: Volkan Yazıcı <[email protected]>
AuthorDate: Mon Mar 20 22:35:37 2023 +0100

    Use a single cleaner in recyclers
---
 .../log4j/spi/ThreadLocalRecyclerFactoryTest.java  | 12 +++------
 .../log4j/message/ReusableMessageFactory.java      |  3 ---
 .../message/ReusableParameterizedMessage.java      |  6 +++--
 .../logging/log4j/spi/DummyRecyclerFactory.java    |  6 ++---
 .../logging/log4j/spi/QueueingRecyclerFactory.java | 27 ++++++--------------
 .../apache/logging/log4j/spi/RecyclerFactory.java  | 27 ++------------------
 .../log4j/spi/ThreadLocalRecyclerFactory.java      | 29 ++++++----------------
 .../log4j/core/layout/AbstractStringLayout.java    |  6 +++--
 .../logging/log4j/core/layout/GelfLayout.java      |  7 ++++--
 .../json/resolver/StackTraceStringResolver.java    | 14 ++++++-----
 10 files changed, 45 insertions(+), 92 deletions(-)

diff --git 
a/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactoryTest.java
 
b/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactoryTest.java
index 14428d20c9..b7ab339375 100644
--- 
a/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactoryTest.java
+++ 
b/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactoryTest.java
@@ -43,14 +43,10 @@ class ThreadLocalRecyclerFactoryTest {
 
     @BeforeEach
     void setUp() {
-        recycler = ThreadLocalRecyclerFactory.getInstance()
-                .create(RecyclableObject::new, o -> {
-                    o.using = true;
-                    o.returned = false;
-                }, o -> {
-                    o.returned = true;
-                    o.using = false;
-                });
+        recycler = 
ThreadLocalRecyclerFactory.getInstance().create(RecyclableObject::new, object 
-> {
+            object.using = true;
+            object.returned = false;
+        });
     }
 
     @ParameterizedTest
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
index 4e494dd82e..7410005c0a 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
@@ -55,15 +55,12 @@ public final class ReusableMessageFactory implements 
MessageFactory {
         super();
         parameterizedMessageRecycler = recyclerFactory.create(
                 ReusableParameterizedMessage::new,
-                RecyclerFactory.getDefaultCleaner(),
                 ReusableParameterizedMessage::clear);
         simpleMessageRecycler = recyclerFactory.create(
                 ReusableSimpleMessage::new,
-                RecyclerFactory.getDefaultCleaner(),
                 ReusableSimpleMessage::clear);
         objectMessageRecycler = recyclerFactory.create(
                 ReusableObjectMessage::new,
-                RecyclerFactory.getDefaultCleaner(),
                 ReusableObjectMessage::clear);
     }
 
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
index 9ec59f6b67..24982934d2 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
@@ -61,8 +61,10 @@ public class ReusableParameterizedMessage implements 
ReusableMessage, ParameterV
                     final int currentPatternLength = messagePattern == null ? 
0 : messagePattern.length();
                     return new StringBuilder(Math.max(MIN_BUILDER_SIZE, 
currentPatternLength * 2));
                 },
-                buffer -> buffer.setLength(0),
-                buffer -> StringBuilders.trimToMaxSize(buffer, 
Constants.MAX_REUSABLE_MESSAGE_SIZE)
+                buffer -> {
+                    StringBuilders.trimToMaxSize(buffer, 
Constants.MAX_REUSABLE_MESSAGE_SIZE);
+                    buffer.setLength(0);
+                }
         );
     }
 
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java
index 3ca81b521d..5f6f6d6019 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java
@@ -35,10 +35,7 @@ public class DummyRecyclerFactory implements RecyclerFactory 
{
     }
 
     @Override
-    public <V> Recycler<V> create(
-            final Supplier<V> supplier,
-            final Consumer<V> lazyCleaner,
-            final Consumer<V> eagerCleaner) {
+    public <V> Recycler<V> create(final Supplier<V> supplier, final 
Consumer<V> cleaner) {
         return new DummyRecycler<>(supplier);
     }
 
@@ -59,4 +56,5 @@ public class DummyRecyclerFactory implements RecyclerFactory {
         public void release(final V value) {}
 
     }
+
 }
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/QueueingRecyclerFactory.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/QueueingRecyclerFactory.java
index 3387ee4780..7579566ef1 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/QueueingRecyclerFactory.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/QueueingRecyclerFactory.java
@@ -31,12 +31,9 @@ public class QueueingRecyclerFactory implements 
RecyclerFactory {
     }
 
     @Override
-    public <V> Recycler<V> create(
-            final Supplier<V> supplier,
-            final Consumer<V> lazyCleaner,
-            final Consumer<V> eagerCleaner) {
+    public <V> Recycler<V> create(final Supplier<V> supplier, final 
Consumer<V> cleaner) {
         final Queue<V> queue = queueFactory.create();
-        return new QueueingRecycler<>(supplier, lazyCleaner, eagerCleaner, 
queue);
+        return new QueueingRecycler<>(supplier, cleaner, queue);
     }
 
     // Visible for tests.
@@ -44,20 +41,16 @@ public class QueueingRecyclerFactory implements 
RecyclerFactory {
 
         private final Supplier<V> supplier;
 
-        private final Consumer<V> lazyCleaner;
-
-        private final Consumer<V> eagerCleaner;
+        private final Consumer<V> cleaner;
 
         private final Queue<V> queue;
 
         private QueueingRecycler(
                 final Supplier<V> supplier,
-                final Consumer<V> lazyCleaner,
-                final Consumer<V> eagerCleaner,
+                final Consumer<V> cleaner,
                 final Queue<V> queue) {
             this.supplier = supplier;
-            this.lazyCleaner = lazyCleaner;
-            this.eagerCleaner = eagerCleaner;
+            this.cleaner = cleaner;
             this.queue = queue;
         }
 
@@ -69,19 +62,15 @@ public class QueueingRecyclerFactory implements 
RecyclerFactory {
         @Override
         public V acquire() {
             final V value = queue.poll();
-            if (value == null) {
-                return supplier.get();
-            } else {
-                lazyCleaner.accept(value);
-                return value;
-            }
+            return value != null ? value : supplier.get();
         }
 
         @Override
         public void release(final V value) {
-            eagerCleaner.accept(value);
+            cleaner.accept(value);
             queue.offer(value);
         }
 
     }
+
 }
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/RecyclerFactory.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/RecyclerFactory.java
index 5bed301691..90b8132755 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/RecyclerFactory.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/RecyclerFactory.java
@@ -39,7 +39,7 @@ public interface RecyclerFactory {
      * @return a new recycler for V-type instances
      */
     default <V> Recycler<V> create(final Supplier<V> supplier) {
-        return create(supplier, getDefaultCleaner());
+        return create(supplier, ignored -> {});
     }
 
     /**
@@ -54,29 +54,6 @@ public interface RecyclerFactory {
      * @param <V> the recyclable type
      * @return a new recycler for V-type instances
      */
-    default <V> Recycler<V> create(Supplier<V> supplier, Consumer<V> cleaner) {
-        return create(supplier, cleaner, getDefaultCleaner());
-    }
-
-    /**
-     * Creates a new recycler using the given functions for providing fresh 
instances and for cleaning recycled
-     * instances lazily or eagerly. The lazy cleaner function is invoked on 
recycled instances before being
-     * returned by {@link Recycler#acquire()}. The eager cleaner function is 
invoked on recycled instances
-     * during {@link Recycler#release(Object)}.
-     *
-     * @param supplier function to provide new instances of a recyclable object
-     * @param lazyCleaner function to invoke to clean a recycled object before 
being acquired
-     * @param eagerCleaner function to invoke to clean a recycled object after 
being released
-     * @param <V> the recyclable type
-     * @return a new recycler for V-type instances
-     */
-    <V> Recycler<V> create(Supplier<V> supplier, Consumer<V> lazyCleaner, 
Consumer<V> eagerCleaner);
-
-    /**
-     * Creates a default cleaner function that does nothing.
-     */
-    static <V> Consumer<V> getDefaultCleaner() {
-        return ignored -> {};
-    }
+    <V> Recycler<V> create(Supplier<V> supplier, Consumer<V> cleaner);
 
 }
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java
index 8a031c1ed9..65a8d1915f 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java
@@ -49,11 +49,8 @@ public class ThreadLocalRecyclerFactory implements 
RecyclerFactory {
     }
 
     @Override
-    public <V> Recycler<V> create(
-            final Supplier<V> supplier,
-            final Consumer<V> lazyCleaner,
-            final Consumer<V> eagerCleaner) {
-        return new ThreadLocalRecycler<>(supplier, lazyCleaner, eagerCleaner);
+    public <V> Recycler<V> create(final Supplier<V> supplier, final 
Consumer<V> cleaner) {
+        return new ThreadLocalRecycler<>(supplier, cleaner);
     }
 
     // Visible for testing
@@ -61,19 +58,13 @@ public class ThreadLocalRecyclerFactory implements 
RecyclerFactory {
 
         private final Supplier<V> supplier;
 
-        private final Consumer<V> lazyCleaner;
-
-        private final Consumer<V> eagerCleaner;
+        private final Consumer<V> cleaner;
 
         private final ThreadLocal<Queue<V>> holder;
 
-        private ThreadLocalRecycler(
-                final Supplier<V> supplier,
-                final Consumer<V> lazyCleaner,
-                final Consumer<V> eagerCleaner) {
+        private ThreadLocalRecycler(final Supplier<V> supplier, final 
Consumer<V> cleaner) {
             this.supplier = supplier;
-            this.lazyCleaner = lazyCleaner;
-            this.eagerCleaner = eagerCleaner;
+            this.cleaner = cleaner;
             this.holder = ThreadLocal.withInitial(() -> 
Queues.SPSC.create(MAX_QUEUE_SIZE));
         }
 
@@ -81,17 +72,12 @@ public class ThreadLocalRecyclerFactory implements 
RecyclerFactory {
         public V acquire() {
             final Queue<V> queue = holder.get();
             final V value = queue.poll();
-            if (value == null) {
-                return supplier.get();
-            } else {
-                lazyCleaner.accept(value);
-                return value;
-            }
+            return value != null ? value : supplier.get();
         }
 
         @Override
         public void release(final V value) {
-            eagerCleaner.accept(value);
+            cleaner.accept(value);
             holder.get().offer(value);
         }
 
@@ -101,4 +87,5 @@ public class ThreadLocalRecyclerFactory implements 
RecyclerFactory {
         }
 
     }
+
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
index da6e062907..55572b4252 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
@@ -123,8 +123,10 @@ public abstract class AbstractStringLayout extends 
AbstractLayout implements Str
     protected static Recycler<StringBuilder> createRecycler(final 
RecyclerFactory recyclerFactory) {
         return recyclerFactory.create(
                 () -> new StringBuilder(DEFAULT_STRING_BUILDER_SIZE),
-                stringBuilder -> stringBuilder.setLength(0),
-                stringBuilder -> StringBuilders.trimToMaxSize(stringBuilder, 
MAX_STRING_BUILDER_SIZE)
+                stringBuilder -> {
+                    StringBuilders.trimToMaxSize(stringBuilder, 
MAX_STRING_BUILDER_SIZE);
+                    stringBuilder.setLength(0);
+                }
         );
     }
 
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index bd0d0f6bcb..69baf2f181 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -488,8 +488,11 @@ public final class GelfLayout extends AbstractStringLayout 
{
         this.layout = patternLayout;
         stacktraceRecycler = recyclerFactory.create(
                 () -> new StringBuilderWriter(MAX_STRING_BUILDER_SIZE),
-                writer -> writer.getBuilder().setLength(0),
-                writer -> StringBuilders.trimToMaxSize(writer.getBuilder(), 
MAX_STRING_BUILDER_SIZE)
+                writer -> {
+                    final StringBuilder stringBuilder = writer.getBuilder();
+                    StringBuilders.trimToMaxSize(stringBuilder, 
MAX_STRING_BUILDER_SIZE);
+                    stringBuilder.setLength(0);
+                }
         );
     }
 
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java
index 35c2f23ca1..a39a8d6180 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.layout.template.json.resolver;
 
 import java.util.List;
+import java.util.function.Consumer;
 import java.util.function.Supplier;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -90,19 +91,20 @@ final class StackTraceStringResolver implements 
StackTraceResolver {
         final TruncatingBufferedPrintWriter srcWriter = 
srcWriterRecycler.acquire();
         try {
             throwable.printStackTrace(srcWriter);
-            final TruncatingBufferedPrintWriter dstWriter = 
truncate(srcWriter);
-            jsonWriter.writeString(dstWriter);
+            truncate(srcWriter, jsonWriter::writeString);
         } finally {
             srcWriterRecycler.release(srcWriter);
         }
     }
 
-    private TruncatingBufferedPrintWriter truncate(
-            final TruncatingBufferedPrintWriter srcWriter) {
+    private void truncate(
+            final TruncatingBufferedPrintWriter srcWriter,
+            final Consumer<TruncatingBufferedPrintWriter> 
effectiveWriterConsumer) {
 
         // Short-circuit if truncation is not enabled.
         if (!truncationEnabled) {
-            return srcWriter;
+            effectiveWriterConsumer.accept(srcWriter);
+            return;
         }
 
         // Allocate temporary buffers and truncate the input.
@@ -116,10 +118,10 @@ final class StackTraceStringResolver implements 
StackTraceResolver {
             } finally {
                 sequencePointerRecycler.release(sequencePointer);
             }
+            effectiveWriterConsumer.accept(dstWriter);
         } finally {
             dstWriterRecycler.release(dstWriter);
         }
-        return dstWriter;
 
     }
 

Reply via email to