From ec4ef5e6836d922e9136ba9631aa6fefd6e59562 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sat, 13 Jan 2024 16:41:15 -0800 Subject: [PATCH] Fix #1186: improve recycled buffer release logic (#1187) --- release-notes/VERSION-2.x | 2 ++ .../jackson/core/util/BufferRecycler.java | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 1e3f64a2fb..dc3ec4c296 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -26,6 +26,8 @@ a pure JSON library. #1179: Allow configuring `DefaultPrettyPrinter` separators for empty Arrays and Objects (contributed by Guillaume L) +#1186: `BufferRecycler` should avoid setting replacement if one already returned, bigger + (suggested by @kkkkkhhhh) 2.16.2 (not yet released) diff --git a/src/main/java/com/fasterxml/jackson/core/util/BufferRecycler.java b/src/main/java/com/fasterxml/jackson/core/util/BufferRecycler.java index 4a8913161c..dc1aac9f21 100644 --- a/src/main/java/com/fasterxml/jackson/core/util/BufferRecycler.java +++ b/src/main/java/com/fasterxml/jackson/core/util/BufferRecycler.java @@ -145,7 +145,12 @@ public byte[] allocByteBuffer(int ix, int minSize) { } public void releaseByteBuffer(int ix, byte[] buffer) { - _byteBuffers.set(ix, buffer); + // 13-Jan-2024, tatu: [core#1186] Replace only if beneficial: + byte[] oldBuffer = _byteBuffers.get(ix); + if ((oldBuffer == null) || buffer.length > oldBuffer.length) { + // Could use CAS, but should not really matter + _byteBuffers.set(ix, buffer); + } } /* @@ -171,7 +176,12 @@ public char[] allocCharBuffer(int ix, int minSize) { } public void releaseCharBuffer(int ix, char[] buffer) { - _charBuffers.set(ix, buffer); + // 13-Jan-2024, tatu: [core#1186] Replace only if beneficial: + char[] oldBuffer = _charBuffers.get(ix); + if ((oldBuffer == null) || buffer.length > oldBuffer.length) { + // Could use CAS, but should not really matter + _charBuffers.set(ix, buffer); + } } /*