From f59c6d868e089fb17a204009b46d33dc10a36ed4 Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Fri, 22 Apr 2016 13:46:44 -0700 Subject: [PATCH] Reuse the existing buffer if the payload will fit in it. This avoids allocating a small (e.g., 8 byte) buffer when a MySQL packet crosses the buffer boundary. --- src/MySql.Data/Serialization/PacketTransmitter.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/MySql.Data/Serialization/PacketTransmitter.cs b/src/MySql.Data/Serialization/PacketTransmitter.cs index c23770f69..b90f74672 100644 --- a/src/MySql.Data/Serialization/PacketTransmitter.cs +++ b/src/MySql.Data/Serialization/PacketTransmitter.cs @@ -137,7 +137,9 @@ private async Task DoReceiveAsync(CancellationToken cancellationTok } // allocate a larger buffer if necessary - var readData = new byte[payloadLength]; + var readData = m_buffer; + if (payloadLength > m_buffer.Length) + readData = new byte[payloadLength]; Array.Copy(m_buffer, m_offset, readData, 0, m_end - m_offset); m_socketAwaitable.EventArgs.SetBuffer(readData, 0, 0); @@ -157,7 +159,8 @@ private async Task DoReceiveAsync(CancellationToken cancellationTok } // switch back to original buffer if a larger one was allocated - m_socketAwaitable.EventArgs.SetBuffer(m_buffer, 0, 0); + if (payloadLength > m_buffer.Length) + m_socketAwaitable.EventArgs.SetBuffer(m_buffer, 0, 0); // check for error if (readData[0] == 0xFF)