diff --git a/src/main/java/com/fasterxml/jackson/core/JsonFactory.java b/src/main/java/com/fasterxml/jackson/core/JsonFactory.java index 952b780737..52e79a0d02 100644 --- a/src/main/java/com/fasterxml/jackson/core/JsonFactory.java +++ b/src/main/java/com/fasterxml/jackson/core/JsonFactory.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.core.sym.ByteQuadsCanonicalizer; import com.fasterxml.jackson.core.sym.CharsToNameCanonicalizer; import com.fasterxml.jackson.core.util.BufferRecycler; -import com.fasterxml.jackson.core.util.BufferRecyclerProvider; +import com.fasterxml.jackson.core.util.BufferRecyclerPool; import com.fasterxml.jackson.core.util.BufferRecyclers; import com.fasterxml.jackson.core.util.JacksonFeature; import com.fasterxml.jackson.core.util.JsonGeneratorDecorator; @@ -264,7 +264,7 @@ public static int collectDefaults() { /** * @since 2.16 */ - protected BufferRecyclerProvider _bufferRecyclerProvider; + protected BufferRecyclerPool _bufferRecyclerPool; /** * Object that implements conversion functionality between @@ -370,7 +370,7 @@ public static int collectDefaults() { public JsonFactory() { this((ObjectCodec) null); } public JsonFactory(ObjectCodec oc) { - _bufferRecyclerProvider = BufferRecyclers.defaultProvider(); + _bufferRecyclerPool = BufferRecyclers.defaultRecyclerPool(); _objectCodec = oc; _quoteChar = DEFAULT_QUOTE_CHAR; _streamReadConstraints = StreamReadConstraints.defaults(); @@ -389,7 +389,7 @@ public JsonFactory(ObjectCodec oc) { */ protected JsonFactory(JsonFactory src, ObjectCodec codec) { - _bufferRecyclerProvider = src._bufferRecyclerProvider; + _bufferRecyclerPool = src._bufferRecyclerPool; _objectCodec = codec; // General @@ -418,7 +418,7 @@ protected JsonFactory(JsonFactory src, ObjectCodec codec) * @since 2.10 */ public JsonFactory(JsonFactoryBuilder b) { - _bufferRecyclerProvider = b._bufferRecyclerProvider; + _bufferRecyclerPool = b._bufferRecyclerPool; _objectCodec = null; // General @@ -448,7 +448,7 @@ public JsonFactory(JsonFactoryBuilder b) { * @param bogus Argument only needed to separate constructor signature; ignored */ protected JsonFactory(TSFBuilder b, boolean bogus) { - _bufferRecyclerProvider = b._bufferRecyclerProvider; + _bufferRecyclerPool = b._bufferRecyclerPool; _objectCodec = null; _factoryFeatures = b._factoryFeatures; @@ -1141,8 +1141,8 @@ public String getRootValueSeparator() { /********************************************************** */ - public JsonFactory setBufferRecyclerProvider(BufferRecyclerProvider p) { - _bufferRecyclerProvider = Objects.requireNonNull(p); + public JsonFactory setBufferRecyclerPool(BufferRecyclerPool p) { + _bufferRecyclerPool = Objects.requireNonNull(p); return this; } @@ -2138,13 +2138,23 @@ protected JsonGenerator _decorate(JsonGenerator g) { */ public BufferRecycler _getBufferRecycler() { + return _getBufferRecyclerPool().acquireBufferRecycler(this); + } + + /** + * Accessor for getting access to {@link BufferRecyclerPool} for getting + * {@link BufferRecycler} instance to use. + * + * @since 2.16 + */ + public BufferRecyclerPool _getBufferRecyclerPool() { // 23-Apr-2015, tatu: Let's allow disabling of buffer recycling // scheme, for cases where it is considered harmful (possibly // on Android, for example) if (!Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING.enabledIn(_factoryFeatures)) { - return new BufferRecycler(); + return BufferRecyclers.nopRecyclerPool(); } - return _bufferRecyclerProvider.acquireBufferRecycler(this); + return _bufferRecyclerPool; } /** diff --git a/src/main/java/com/fasterxml/jackson/core/TSFBuilder.java b/src/main/java/com/fasterxml/jackson/core/TSFBuilder.java index 4dc679a19a..f34c655c31 100644 --- a/src/main/java/com/fasterxml/jackson/core/TSFBuilder.java +++ b/src/main/java/com/fasterxml/jackson/core/TSFBuilder.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.core.io.OutputDecorator; import com.fasterxml.jackson.core.json.JsonReadFeature; import com.fasterxml.jackson.core.json.JsonWriteFeature; -import com.fasterxml.jackson.core.util.BufferRecyclerProvider; +import com.fasterxml.jackson.core.util.BufferRecyclerPool; import com.fasterxml.jackson.core.util.BufferRecyclers; import com.fasterxml.jackson.core.util.JsonGeneratorDecorator; @@ -75,7 +75,7 @@ public abstract class TSFBuilder List _copy(List src) { public int streamReadFeatures() { return _streamReadFeatures; } public int streamWriteFeatures() { return _streamWriteFeatures; } - public BufferRecyclerProvider bufferRecyclerProvider() { - return _bufferRecyclerProvider; + public BufferRecyclerPool bufferRecyclerPool() { + return _bufferRecyclerPool; } public InputDecorator inputDecorator() { return _inputDecorator; } @@ -316,14 +316,14 @@ public B configure(JsonWriteFeature f, boolean state) { // // // Other configuration, helper objects /** - * @param p BufferRecyclerProvider to use for buffer allocation + * @param p BufferRecyclerPool to use for buffer allocation * * @return this builder (for call chaining) * * @since 2.16 */ - public B bufferRecyclerProvider(BufferRecyclerProvider p) { - _bufferRecyclerProvider = Objects.requireNonNull(p); + public B bufferRecyclerPool(BufferRecyclerPool p) { + _bufferRecyclerPool = Objects.requireNonNull(p); return _this(); } diff --git a/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclerPool.java b/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclerPool.java new file mode 100644 index 0000000000..cd2276b0c2 --- /dev/null +++ b/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclerPool.java @@ -0,0 +1,17 @@ +package com.fasterxml.jackson.core.util; + +import com.fasterxml.jackson.core.TokenStreamFactory; + +/** + * Interface for entity that controls creation and possible reuse of {@link BufferRecycler} + * instances used for recycling of underlying input/output buffers. + * + * @since 2.16 + */ +public interface BufferRecyclerPool + extends java.io.Serializable +{ + public BufferRecycler acquireBufferRecycler(TokenStreamFactory forFactory); + + public void releaseBufferRecycler(BufferRecycler recycler); +} diff --git a/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclerProvider.java b/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclerProvider.java deleted file mode 100644 index 1f1635b851..0000000000 --- a/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclerProvider.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fasterxml.jackson.core.util; - -import com.fasterxml.jackson.core.TokenStreamFactory; - -/** - * Provider for {@link BufferRecycler}s to allow pluggable and optional - * recycling of underlying input/output buffers. - * - * @since 2.16 - */ -public interface BufferRecyclerProvider - extends java.io.Serializable -{ - public abstract BufferRecycler acquireBufferRecycler(TokenStreamFactory forFactory); -} diff --git a/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclers.java b/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclers.java index a5617cd610..c7cbfd025a 100644 --- a/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclers.java +++ b/src/main/java/com/fasterxml/jackson/core/util/BufferRecyclers.java @@ -63,7 +63,7 @@ public class BufferRecyclers * * @return {@link BufferRecycler} to use * - * @deprecated Since 2.16 should use {@link BufferRecyclerProvider} abstraction instead + * @deprecated Since 2.16 should use {@link BufferRecyclerPool} abstraction instead * of calling static methods of this class */ @Deprecated // since 2.16 @@ -188,30 +188,63 @@ public static byte[] quoteAsJsonUTF8(String rawText) { /* /********************************************************************** - /* Default BufferRecyclerProvider implementations + /* Default BufferRecyclerPool implementations /********************************************************************** */ - public static BufferRecyclerProvider defaultProvider() { - return ThreadLocalBufferRecyclerProvider.INSTANCE; + public static BufferRecyclerPool defaultRecyclerPool() { + return ThreadLocalRecyclerPool.INSTANCE; + } + + public static BufferRecyclerPool nopRecyclerPool() { + return NonRecyclingRecyclerPool.INSTANCE; } /** - * Default {@link BufferRecyclerProvider} implementation that uses + * Default {@link BufferRecyclerPool} implementation that uses * {@link ThreadLocal} for recycling instances. * * @since 2.16 */ - public static class ThreadLocalBufferRecyclerProvider - implements BufferRecyclerProvider + public static class ThreadLocalRecyclerPool + implements BufferRecyclerPool { private static final long serialVersionUID = 1L; - public final static ThreadLocalBufferRecyclerProvider INSTANCE = new ThreadLocalBufferRecyclerProvider(); + public final static ThreadLocalRecyclerPool INSTANCE = new ThreadLocalRecyclerPool(); @Override public BufferRecycler acquireBufferRecycler(TokenStreamFactory forFactory) { return getBufferRecycler(); } + + @Override + public void releaseBufferRecycler(BufferRecycler recycler) { + ; // nothing to do, relies on ThreadLocal + } + } + + /** + * {@link BufferRecyclerPool} implementation that does not use + * any pool but simply creates new instances when necessary. + * + * @since 2.16 + */ + public static class NonRecyclingRecyclerPool + implements BufferRecyclerPool + { + private static final long serialVersionUID = 1L; + + public final static ThreadLocalRecyclerPool INSTANCE = new ThreadLocalRecyclerPool(); + + @Override + public BufferRecycler acquireBufferRecycler(TokenStreamFactory forFactory) { + return new BufferRecycler(); + } + + @Override + public void releaseBufferRecycler(BufferRecycler recycler) { + ; // nothing to do, relies on ThreadLocal + } } }