Skip to content

Commit 584f510

Browse files
committed
Remove struct allocation on the stack
1 parent 2c32d05 commit 584f510

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

src/cluster/DotNext.Net.Cluster/Net/Multiplexing/MultiplexedStream.TransportSideReader.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,21 @@ private ValueTask WriteFrameAsync(IBufferWriter<byte> writer, ulong streamId, in
7272
: ValueTask.CompletedTask;
7373
}
7474

75-
private (int, SequencePosition) WriteFrame(Span<byte> output, ulong streamId, in ReadResult readResult, out bool completed)
75+
private bool WriteFrame(Span<byte> output, ulong streamId, in ReadResult readResult, out int bytesWritten, out SequencePosition consumed)
7676
{
7777
Debug.Assert(output.Length > FrameHeader.Size);
7878

7979
var inputBuffer = readResult.Buffer;
80-
int bytesWritten;
81-
SequencePosition position;
80+
bool completed;
8281
if (output.Slice(FrameHeader.Size).TrimLength(inputWindow) is { Length: > 0 } payload)
8382
{
8483
// we cannot send more than window size
85-
bytesWritten = inputBuffer.CopyTo(payload, out position);
84+
bytesWritten = inputBuffer.CopyTo(payload, out consumed);
8685

8786
Debug.Assert(bytesWritten <= MaxFrameSize);
8887

8988
FrameControl control;
90-
if (!position.Equals(inputBuffer.End))
89+
if (!consumed.Equals(inputBuffer.End))
9190
{
9291
control = FrameControl.DataChunk;
9392
completed = false;
@@ -112,19 +111,25 @@ private ValueTask WriteFrameAsync(IBufferWriter<byte> writer, ulong streamId, in
112111
// input window is empty, nothing we can read
113112
completed = false;
114113
bytesWritten = 0;
115-
position = inputBuffer.Start;
114+
consumed = inputBuffer.Start;
116115
}
117116

118-
return (bytesWritten, position);
117+
return completed;
119118
}
120119

121120
private bool WriteFrame(IBufferWriter<byte> writer, ulong streamId, in ReadResult result)
122121
{
123122
var buffer = writer.GetSpan(frameAndHeaderSize);
124-
var (bytesWritten, position) = WriteFrame(buffer.Slice(0, frameAndHeaderSize), streamId, result, out var completed);
125-
writer.Advance(bytesWritten);
126-
transportReader.AdvanceTo(position);
123+
var completed = WriteFrame(
124+
buffer.Slice(0, frameAndHeaderSize),
125+
streamId,
126+
result,
127+
out var bytesWritten,
128+
out var consumed);
127129

130+
writer.Advance(bytesWritten);
131+
transportReader.AdvanceTo(consumed);
132+
128133
return completed;
129134
}
130135

0 commit comments

Comments
 (0)