@@ -58,13 +58,19 @@ private static ValueTask<Packet> CreatePacketFromPayload(ArraySegment<byte> payl
58
58
protocolErrorBehavior == ProtocolErrorBehavior . Throw ? ValueTaskExtensions . FromException < Packet > ( new EndOfStreamException ( ) ) :
59
59
default ( ValueTask < Packet > ) ;
60
60
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 )
62
68
{
63
69
var readPacketTask = ReadPacketAsync ( bufferedByteReader , byteHandler , getNextSequenceNumber , protocolErrorBehavior , ioBehavior ) ;
64
70
while ( readPacketTask . IsCompleted )
65
71
{
66
72
ValueTask < ArraySegment < byte > > result ;
67
- if ( HasReadPayload ( ref previousPayloads , readPacketTask . Result , protocolErrorBehavior , out result ) )
73
+ if ( HasReadPayload ( previousPayloads , readPacketTask . Result , protocolErrorBehavior , out result ) )
68
74
return result ;
69
75
70
76
readPacketTask = ReadPacketAsync ( bufferedByteReader , byteHandler , getNextSequenceNumber , protocolErrorBehavior , ioBehavior ) ;
@@ -73,40 +79,40 @@ public static ValueTask<ArraySegment<byte>> ReadPayloadAsync(BufferedByteReader
73
79
return AddContinuation ( readPacketTask , bufferedByteReader , byteHandler , getNextSequenceNumber , previousPayloads , protocolErrorBehavior , ioBehavior ) ;
74
80
75
81
// 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_ )
77
83
{
78
84
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_ ) ) ;
81
87
}
82
88
}
83
89
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 )
85
91
{
86
92
if ( packet == null && protocolErrorBehavior == ProtocolErrorBehavior . Ignore )
87
93
{
88
94
result = default ( ValueTask < ArraySegment < byte > > ) ;
89
95
return true ;
90
96
}
91
97
92
- var previousPayloadsArray = previousPayloads . Array ;
93
- if ( previousPayloadsArray == null && packet . Contents . Count < MaxPacketSize )
98
+ if ( previousPayloads . Count == 0 && packet . Contents . Count < MaxPacketSize )
94
99
{
95
100
result = new ValueTask < ArraySegment < byte > > ( packet . Contents ) ;
96
101
return true ;
97
102
}
98
103
104
+ var previousPayloadsArray = previousPayloads . Array ;
99
105
if ( previousPayloadsArray == null )
100
106
previousPayloadsArray = new byte [ ProtocolUtility . MaxPacketSize + 1 ] ;
101
107
else if ( previousPayloads . Offset + previousPayloads . Count + packet . Contents . Count > previousPayloadsArray . Length )
102
108
Array . Resize ( ref previousPayloadsArray , previousPayloadsArray . Length * 2 ) ;
103
109
104
110
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 ) ;
106
112
107
113
if ( packet . Contents . Count < ProtocolUtility . MaxPacketSize )
108
114
{
109
- result = new ValueTask < ArraySegment < byte > > ( previousPayloads ) ;
115
+ result = new ValueTask < ArraySegment < byte > > ( previousPayloads . ArraySegment ) ;
110
116
return true ;
111
117
}
112
118
0 commit comments