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 a9114d8a9521512401ef2f857c83063144585529
Author: Volkan Yazıcı <[email protected]>
AuthorDate: Wed Mar 29 14:04:03 2023 +0200

    Remove `ThreadLocal`s in `JsonUtils`
---
 .../apache/logging/log4j/core/util/JsonUtils.java  | 75 +++++++++++-----------
 1 file changed, 37 insertions(+), 38 deletions(-)

diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/JsonUtils.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/JsonUtils.java
index fede436bb2..059b963ad0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/JsonUtils.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/JsonUtils.java
@@ -16,6 +16,8 @@
  */
 package org.apache.logging.log4j.core.util;
 
+import org.apache.logging.log4j.spi.LoggingSystem;
+import org.apache.logging.log4j.spi.Recycler;
 import org.apache.logging.log4j.util.Lazy;
 
 /**
@@ -55,52 +57,49 @@ public final class JsonUtils {
     /**
      * Temporary buffer used for composing quote/escape sequences
      */
-    private final static ThreadLocal<char[]> _qbufLocal = new ThreadLocal<>();
-
-    private static char[] getQBuf() {
-        char[] _qbuf = _qbufLocal.get();
-        if (_qbuf == null) {
-            _qbuf = new char[6];
-            _qbuf[0] = '\\';
-            _qbuf[2] = '0';
-            _qbuf[3] = '0';
-
-            _qbufLocal.set(_qbuf);
-        }
-        return _qbuf;
-    }
+    private final static Recycler<char[]> qbufRecycler = 
LoggingSystem.getRecyclerFactory().create(() -> {
+        char[] qbuf = new char[6];
+        qbuf[0] = '\\';
+        qbuf[2] = '0';
+        qbuf[3] = '0';
+        return qbuf;
+    });
 
     /**
      * Quote text contents using JSON standard quoting, and append results to 
a supplied {@link StringBuilder}.
      */
     public static void quoteAsString(final CharSequence input, final 
StringBuilder output) {
-        final char[] qbuf = getQBuf();
-        final int[] escCodes = ESC_CODES.value();
-        final int escCodeCount = escCodes.length;
-        int inPtr = 0;
-        final int inputLen = input.length();
+        final char[] qbuf = qbufRecycler.acquire();
+        try {
+            final int[] escCodes = ESC_CODES.value();
+            final int escCodeCount = escCodes.length;
+            int inPtr = 0;
+            final int inputLen = input.length();
 
-        outer:
-        while (inPtr < inputLen) {
-            tight_loop:
-            while (true) {
-                final char c = input.charAt(inPtr);
-                if (c < escCodeCount && escCodes[c] != 0) {
-                    break tight_loop;
-                }
-                output.append(c);
-                if (++inPtr >= inputLen) {
-                    break outer;
+            outer:
+            while (inPtr < inputLen) {
+                tight_loop:
+                while (true) {
+                    final char c = input.charAt(inPtr);
+                    if (c < escCodeCount && escCodes[c] != 0) {
+                        break tight_loop;
+                    }
+                    output.append(c);
+                    if (++inPtr >= inputLen) {
+                        break outer;
+                    }
                 }
-            }
-            // something to escape; 2 or 6-char variant?
-            final char d = input.charAt(inPtr++);
-            final int escCode = escCodes[d];
-            final int length = (escCode < 0)
-                    ? _appendNumeric(d, qbuf)
-                    : _appendNamed(escCode, qbuf);
+                // something to escape; 2 or 6-char variant?
+                final char d = input.charAt(inPtr++);
+                final int escCode = escCodes[d];
+                final int length = (escCode < 0)
+                        ? _appendNumeric(d, qbuf)
+                        : _appendNamed(escCode, qbuf);
 
-            output.append(qbuf, 0, length);
+                output.append(qbuf, 0, length);
+            }
+        } finally {
+            qbufRecycler.release(qbuf);
         }
     }
 

Reply via email to