@@ -49,6 +49,10 @@ public class MessagePackParser
4949{
5050 private static final ThreadLocal <Tuple <Object , MessageUnpacker >> messageUnpackerHolder =
5151 new ThreadLocal <Tuple <Object , MessageUnpacker >>();
52+
53+ private static final ThreadLocal <InputStreamBufferInput > inputStreamBufferInputHolder =
54+ new ThreadLocal <>();
55+
5256 private final MessageUnpacker messageUnpacker ;
5357
5458 private static final BigInteger LONG_MIN = BigInteger .valueOf ((long ) Long .MIN_VALUE );
@@ -130,7 +134,36 @@ public MessagePackParser(
130134 boolean reuseResourceInParser )
131135 throws IOException
132136 {
133- this (ctxt , features , new InputStreamBufferInput (in ), objectCodec , in , reuseResourceInParser );
137+ this (ctxt , features , objectCodec , in , reuseResourceInParser , true );
138+ }
139+
140+ public MessagePackParser (
141+ IOContext ctxt ,
142+ int features ,
143+ ObjectCodec objectCodec ,
144+ InputStream in ,
145+ boolean reuseResourceInParser ,
146+ boolean reuseInputStreamBufferInput )
147+ throws IOException
148+ {
149+ this (ctxt , features , getInputStreamBufferInput (in , reuseInputStreamBufferInput ), objectCodec , in , reuseResourceInParser );
150+ }
151+
152+ private static InputStreamBufferInput getInputStreamBufferInput (InputStream in , boolean reuseInputStreamBufferInput )
153+ {
154+ if (reuseInputStreamBufferInput ) {
155+ final InputStreamBufferInput inputStreamBufferInput = inputStreamBufferInputHolder .get ();
156+ if (inputStreamBufferInput != null ) {
157+ inputStreamBufferInput .reset (in );
158+ return inputStreamBufferInput ;
159+ }
160+ final InputStreamBufferInput newInputStreamBufferInput = new InputStreamBufferInput (in );
161+ inputStreamBufferInputHolder .set (newInputStreamBufferInput );
162+ return newInputStreamBufferInput ;
163+ }
164+ else {
165+ return new InputStreamBufferInput (in );
166+ }
134167 }
135168
136169 public MessagePackParser (IOContext ctxt , int features , ObjectCodec objectCodec , byte [] bytes )
0 commit comments