Skip to content

Commit 978129e

Browse files
committed
Reduce allocations by making Packet a struct.
Removed SequenceNumber, since it was never read. Packet now essentially becomes an "alias" for ArraySegment<byte> (with a shorter name and semantic difference).
1 parent 88c13ac commit 978129e

File tree

2 files changed

+11
-20
lines changed

2 files changed

+11
-20
lines changed
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
using System;
1+
using System;
22

33
namespace MySql.Data.Protocol.Serialization
44
{
5-
internal class Packet
5+
internal struct Packet
66
{
7-
public Packet(int sequenceNumber, ArraySegment<byte> contents)
7+
public Packet(ArraySegment<byte> contents)
88
{
9-
SequenceNumber = sequenceNumber;
109
Contents = contents;
1110
}
1211

13-
public int SequenceNumber { get; }
1412
public ArraySegment<byte> Contents { get; }
1513
}
1614
}

src/MySqlConnector/Protocol/Serialization/ProtocolUtility.cs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Buffers;
33
using System.IO;
44
using System.Threading.Tasks;
@@ -45,16 +45,16 @@ private static ValueTask<Packet> ReadPacketAfterHeader(ArraySegment<byte> header
4545

4646
var payloadBytesTask = bufferedByteReader.ReadBytesAsync(byteHandler, payloadLength, ioBehavior);
4747
if (payloadBytesTask.IsCompleted)
48-
return CreatePacketFromPayload(payloadBytesTask.Result, payloadLength, packetSequenceNumber, protocolErrorBehavior);
49-
return AddContinuation(payloadBytesTask, payloadLength, packetSequenceNumber, protocolErrorBehavior);
48+
return CreatePacketFromPayload(payloadBytesTask.Result, payloadLength, protocolErrorBehavior);
49+
return AddContinuation(payloadBytesTask, payloadLength, protocolErrorBehavior);
5050

5151
// NOTE: use a local function (with no captures) to defer creation of lambda objects
52-
ValueTask<Packet> AddContinuation(ValueTask<ArraySegment<byte>> payloadBytesTask_, int payloadLength_, int packetSequenceNumber_, ProtocolErrorBehavior protocolErrorBehavior_)
53-
=> payloadBytesTask_.ContinueWith(x => CreatePacketFromPayload(x, payloadLength_, packetSequenceNumber_, protocolErrorBehavior_));
52+
ValueTask<Packet> AddContinuation(ValueTask<ArraySegment<byte>> payloadBytesTask_, int payloadLength_, ProtocolErrorBehavior protocolErrorBehavior_)
53+
=> payloadBytesTask_.ContinueWith(x => CreatePacketFromPayload(x, payloadLength_, protocolErrorBehavior_));
5454
}
5555

56-
private static ValueTask<Packet> CreatePacketFromPayload(ArraySegment<byte> payloadBytes, int payloadLength, int packetSequenceNumber, ProtocolErrorBehavior protocolErrorBehavior) =>
57-
payloadBytes.Count >= payloadLength ? new ValueTask<Packet>(new Packet(packetSequenceNumber, payloadBytes)) :
56+
private static ValueTask<Packet> CreatePacketFromPayload(ArraySegment<byte> payloadBytes, int payloadLength, ProtocolErrorBehavior protocolErrorBehavior) =>
57+
payloadBytes.Count >= payloadLength ? new ValueTask<Packet>(new Packet(payloadBytes)) :
5858
protocolErrorBehavior == ProtocolErrorBehavior.Throw ? ValueTaskExtensions.FromException<Packet>(new EndOfStreamException()) :
5959
default(ValueTask<Packet>);
6060

@@ -69,8 +69,7 @@ private static ValueTask<ArraySegment<byte>> DoReadPayloadAsync(BufferedByteRead
6969
var readPacketTask = ReadPacketAsync(bufferedByteReader, byteHandler, getNextSequenceNumber, protocolErrorBehavior, ioBehavior);
7070
while (readPacketTask.IsCompleted)
7171
{
72-
ValueTask<ArraySegment<byte>> result;
73-
if (HasReadPayload(previousPayloads, readPacketTask.Result, protocolErrorBehavior, out result))
72+
if (HasReadPayload(previousPayloads, readPacketTask.Result, protocolErrorBehavior, out var result))
7473
return result;
7574

7675
readPacketTask = ReadPacketAsync(bufferedByteReader, byteHandler, getNextSequenceNumber, protocolErrorBehavior, ioBehavior);
@@ -89,12 +88,6 @@ ValueTask<ArraySegment<byte>> AddContinuation(ValueTask<Packet> readPacketTask_,
8988

9089
private static bool HasReadPayload(ArraySegmentHolder<byte> previousPayloads, Packet packet, ProtocolErrorBehavior protocolErrorBehavior, out ValueTask<ArraySegment<byte>> result)
9190
{
92-
if (packet == null && protocolErrorBehavior == ProtocolErrorBehavior.Ignore)
93-
{
94-
result = default(ValueTask<ArraySegment<byte>>);
95-
return true;
96-
}
97-
9891
if (previousPayloads.Count == 0 && packet.Contents.Count < MaxPacketSize)
9992
{
10093
result = new ValueTask<ArraySegment<byte>>(packet.Contents);

0 commit comments

Comments
 (0)