@@ -58,13 +58,19 @@ private static ValueTask<Packet> CreatePacketFromPayload(ArraySegment<byte> payl
5858 protocolErrorBehavior == ProtocolErrorBehavior . Throw ? ValueTaskExtensions . FromException < Packet > ( new EndOfStreamException ( ) ) :
5959 default ( ValueTask < Packet > ) ;
6060
61- public static ValueTask < ArraySegment < byte > > ReadPayloadAsync ( BufferedByteReader bufferedByteReader , IByteHandler byteHandler , Func < int > getNextSequenceNumber , ArraySegment < byte > previousPayloads , ProtocolErrorBehavior protocolErrorBehavior , IOBehavior ioBehavior )
61+ public static ValueTask < ArraySegment < byte > > ReadPayloadAsync ( BufferedByteReader bufferedByteReader , IByteHandler byteHandler , Func < int > getNextSequenceNumber , ArraySegmentHolder < byte > cache , ProtocolErrorBehavior protocolErrorBehavior , IOBehavior ioBehavior )
62+ {
63+ cache . Clear ( ) ;
64+ return DoReadPayloadAsync ( bufferedByteReader , byteHandler , getNextSequenceNumber , cache , protocolErrorBehavior , ioBehavior ) ;
65+ }
66+
67+ private static ValueTask < ArraySegment < byte > > DoReadPayloadAsync ( BufferedByteReader bufferedByteReader , IByteHandler byteHandler , Func < int > getNextSequenceNumber , ArraySegmentHolder < byte > previousPayloads , ProtocolErrorBehavior protocolErrorBehavior , IOBehavior ioBehavior )
6268 {
6369 var readPacketTask = ReadPacketAsync ( bufferedByteReader , byteHandler , getNextSequenceNumber , protocolErrorBehavior , ioBehavior ) ;
6470 while ( readPacketTask . IsCompleted )
6571 {
6672 ValueTask < ArraySegment < byte > > result ;
67- if ( HasReadPayload ( ref previousPayloads , readPacketTask . Result , protocolErrorBehavior , out result ) )
73+ if ( HasReadPayload ( previousPayloads , readPacketTask . Result , protocolErrorBehavior , out result ) )
6874 return result ;
6975
7076 readPacketTask = ReadPacketAsync ( bufferedByteReader , byteHandler , getNextSequenceNumber , protocolErrorBehavior , ioBehavior ) ;
@@ -73,40 +79,40 @@ public static ValueTask<ArraySegment<byte>> ReadPayloadAsync(BufferedByteReader
7379 return AddContinuation ( readPacketTask , bufferedByteReader , byteHandler , getNextSequenceNumber , previousPayloads , protocolErrorBehavior , ioBehavior ) ;
7480
7581 // NOTE: use a local function (with no captures) to defer creation of lambda objects
76- ValueTask < ArraySegment < byte > > AddContinuation ( ValueTask < Packet > readPacketTask_ , BufferedByteReader bufferedByteReader_ , IByteHandler byteHandler_ , Func < int > getNextSequenceNumber_ , ArraySegment < byte > previousPayloads_ , ProtocolErrorBehavior protocolErrorBehavior_ , IOBehavior ioBehavior_ )
82+ ValueTask < ArraySegment < byte > > AddContinuation ( ValueTask < Packet > readPacketTask_ , BufferedByteReader bufferedByteReader_ , IByteHandler byteHandler_ , Func < int > getNextSequenceNumber_ , ArraySegmentHolder < byte > previousPayloads_ , ProtocolErrorBehavior protocolErrorBehavior_ , IOBehavior ioBehavior_ )
7783 {
7884 return readPacketTask_ . ContinueWith ( packet =>
79- HasReadPayload ( ref previousPayloads_ , packet , protocolErrorBehavior_ , out var result_ ) ? result_ :
80- ReadPayloadAsync ( bufferedByteReader_ , byteHandler_ , getNextSequenceNumber_ , previousPayloads_ , protocolErrorBehavior_ , ioBehavior_ ) ) ;
85+ HasReadPayload ( previousPayloads_ , packet , protocolErrorBehavior_ , out var result_ ) ? result_ :
86+ DoReadPayloadAsync ( bufferedByteReader_ , byteHandler_ , getNextSequenceNumber_ , previousPayloads_ , protocolErrorBehavior_ , ioBehavior_ ) ) ;
8187 }
8288 }
8389
84- private static bool HasReadPayload ( ref ArraySegment < byte > previousPayloads , Packet packet , ProtocolErrorBehavior protocolErrorBehavior , out ValueTask < ArraySegment < byte > > result )
90+ private static bool HasReadPayload ( ArraySegmentHolder < byte > previousPayloads , Packet packet , ProtocolErrorBehavior protocolErrorBehavior , out ValueTask < ArraySegment < byte > > result )
8591 {
8692 if ( packet == null && protocolErrorBehavior == ProtocolErrorBehavior . Ignore )
8793 {
8894 result = default ( ValueTask < ArraySegment < byte > > ) ;
8995 return true ;
9096 }
9197
92- var previousPayloadsArray = previousPayloads . Array ;
93- if ( previousPayloadsArray == null && packet . Contents . Count < MaxPacketSize )
98+ if ( previousPayloads . Count == 0 && packet . Contents . Count < MaxPacketSize )
9499 {
95100 result = new ValueTask < ArraySegment < byte > > ( packet . Contents ) ;
96101 return true ;
97102 }
98103
104+ var previousPayloadsArray = previousPayloads . Array ;
99105 if ( previousPayloadsArray == null )
100106 previousPayloadsArray = new byte [ ProtocolUtility . MaxPacketSize + 1 ] ;
101107 else if ( previousPayloads . Offset + previousPayloads . Count + packet . Contents . Count > previousPayloadsArray . Length )
102108 Array . Resize ( ref previousPayloadsArray , previousPayloadsArray . Length * 2 ) ;
103109
104110 Buffer . BlockCopy ( packet . Contents . Array , packet . Contents . Offset , previousPayloadsArray , previousPayloads . Offset + previousPayloads . Count , packet . Contents . Count ) ;
105- previousPayloads = new ArraySegment < byte > ( previousPayloadsArray , previousPayloads . Offset , previousPayloads . Count + packet . Contents . Count ) ;
111+ previousPayloads . ArraySegment = new ArraySegment < byte > ( previousPayloadsArray , previousPayloads . Offset , previousPayloads . Count + packet . Contents . Count ) ;
106112
107113 if ( packet . Contents . Count < ProtocolUtility . MaxPacketSize )
108114 {
109- result = new ValueTask < ArraySegment < byte > > ( previousPayloads ) ;
115+ result = new ValueTask < ArraySegment < byte > > ( previousPayloads . ArraySegment ) ;
110116 return true ;
111117 }
112118
0 commit comments