perf(net): borrow inbound packet storage
Decode headers, optional fields, fragments, and single-fragment messages directly over pooled datagrams. Copy only fragment state that crosses a datagram lifetime, preserve synchronous dispatch and ACK ordering, and lock the path to the owned decoder with differential and zero-allocation tests.
This commit is contained in:
parent
7211bb1bf7
commit
e928c5dd02
18 changed files with 1329 additions and 66 deletions
|
|
@ -124,4 +124,81 @@ public class FragmentAssemblerTests
|
|||
assembler.DropAll();
|
||||
Assert.Equal(0, assembler.PartialCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryIngest_BorrowedSingleFragment_ReturnsOriginalMemory()
|
||||
{
|
||||
var assembler = new FragmentAssembler();
|
||||
byte[] payload = [1, 2, 3];
|
||||
var fragment = new BorrowedMessageFragment(
|
||||
MakeFrag(10, 1, 0, payload, 11).Header,
|
||||
payload);
|
||||
|
||||
bool complete = assembler.TryIngest(
|
||||
fragment,
|
||||
out ReadOnlyMemory<byte> message,
|
||||
out ushort queue);
|
||||
payload[1] = 0xAA;
|
||||
|
||||
Assert.True(complete);
|
||||
Assert.Equal(11, queue);
|
||||
Assert.Equal(0xAA, message.Span[1]);
|
||||
Assert.Equal(0, assembler.PartialCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryIngest_BorrowedMultiFragment_CopiesAcrossDatagrams()
|
||||
{
|
||||
var assembler = new FragmentAssembler();
|
||||
byte[] firstPayload = [1, 2];
|
||||
byte[] secondPayload = [3, 4];
|
||||
var first = new BorrowedMessageFragment(
|
||||
MakeFrag(20, 2, 0, firstPayload, 12).Header,
|
||||
firstPayload);
|
||||
var second = new BorrowedMessageFragment(
|
||||
MakeFrag(20, 2, 1, secondPayload, 12).Header,
|
||||
secondPayload);
|
||||
|
||||
Assert.False(assembler.TryIngest(
|
||||
first,
|
||||
out _,
|
||||
out _));
|
||||
firstPayload[0] = 0xFF;
|
||||
Assert.True(assembler.TryIngest(
|
||||
second,
|
||||
out ReadOnlyMemory<byte> message,
|
||||
out ushort queue));
|
||||
secondPayload[0] = 0xEE;
|
||||
|
||||
Assert.Equal(12, queue);
|
||||
Assert.Equal(new byte[] { 1, 2, 3, 4 }, message.ToArray());
|
||||
Assert.Equal(0, assembler.PartialCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryIngest_ConflictingBorrowedIdentity_PreservesOriginalPartial()
|
||||
{
|
||||
var assembler = new FragmentAssembler();
|
||||
var first = new BorrowedMessageFragment(
|
||||
MakeFrag(30, 2, 0, [1], 13).Header,
|
||||
new byte[] { 1 });
|
||||
var conflict = new BorrowedMessageFragment(
|
||||
MakeFrag(30, 3, 1, [9], 14).Header,
|
||||
new byte[] { 9 });
|
||||
var completion = new BorrowedMessageFragment(
|
||||
MakeFrag(30, 2, 1, [2], 13).Header,
|
||||
new byte[] { 2 });
|
||||
|
||||
Assert.False(assembler.TryIngest(first, out _, out _));
|
||||
Assert.False(assembler.TryIngest(conflict, out _, out _));
|
||||
Assert.Equal(1, assembler.PartialCount);
|
||||
Assert.True(assembler.TryIngest(
|
||||
completion,
|
||||
out ReadOnlyMemory<byte> message,
|
||||
out ushort queue));
|
||||
|
||||
Assert.Equal(13, queue);
|
||||
Assert.Equal(new byte[] { 1, 2 }, message.ToArray());
|
||||
Assert.Equal(0, assembler.PartialCount);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue