Skip to content

Commit 1fc163d

Browse files
author
yupliner
committed
Do not call MemoryStream.ToArray during write of OutboundFrame
1 parent 0fc8e0e commit 1fc163d

File tree

3 files changed

+24
-24
lines changed

3 files changed

+24
-24
lines changed

projects/client/RabbitMQ.Client/src/client/impl/ExtensionMethods.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
using System;
4242
using System.Collections.Generic;
43+
using System.IO;
4344
using System.Linq;
4445

4546
namespace RabbitMQ.Client.Impl
@@ -63,5 +64,16 @@ public static T RandomItem<T>(this IList<T> list)
6364
var hashCode = Math.Abs(Guid.NewGuid().GetHashCode());
6465
return list.ElementAt<T>(hashCode % n);
6566
}
67+
68+
public static ArraySegment<byte> GetBufferSegment(this MemoryStream ms)
69+
{
70+
#if CORECLR15
71+
var payload = ms.ToArray();
72+
return new ArraySegment<byte>(payload, 0, payload.Length);
73+
#else
74+
var buffer = ms.GetBuffer();
75+
return new ArraySegment<byte>(buffer, 0, (int)ms.Position);
76+
#endif
77+
}
6678
}
6779
}

projects/client/RabbitMQ.Client/src/client/impl/Frame.cs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,9 @@ public override void WritePayload(NetworkBinaryWriter writer)
7373
nw.Write(header.ProtocolClassId);
7474
header.WriteTo(nw, (ulong)bodyLength);
7575

76-
#if CORECLR15
77-
var payload = ms.ToArray();
78-
writer.Write((uint)payload.Length);
79-
writer.Write(payload);
80-
#else
81-
var buffer = ms.GetBuffer();
82-
writer.Write((uint)ms.Position);
83-
writer.Write(buffer, 0, (int)ms.Position);
84-
#endif
76+
var bufferSegment = ms.GetBufferSegment();
77+
writer.Write((uint)bufferSegment.Count);
78+
writer.Write(bufferSegment.Array, bufferSegment.Offset, bufferSegment.Count);
8579
}
8680
}
8781

@@ -126,15 +120,9 @@ public override void WritePayload(NetworkBinaryWriter writer)
126120
method.WriteArgumentsTo(argWriter);
127121
argWriter.Flush();
128122

129-
#if CORECLR15
130-
var payload = ms.ToArray();
131-
writer.Write((uint)payload.Length);
132-
writer.Write(payload);
133-
#else
134-
var buffer = ms.GetBuffer();
135-
writer.Write((uint)ms.Position);
136-
writer.Write(buffer, 0, (int)ms.Position);
137-
#endif
123+
var bufferSegment = ms.GetBufferSegment();
124+
writer.Write((uint)bufferSegment.Count);
125+
writer.Write(bufferSegment.Array, bufferSegment.Offset, bufferSegment.Count);
138126
}
139127
}
140128

projects/client/RabbitMQ.Client/src/client/impl/SocketFrameHandler.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ public void SendHeader()
222222
nbw.Write((byte)Endpoint.Protocol.MajorVersion);
223223
nbw.Write((byte)Endpoint.Protocol.MinorVersion);
224224
}
225-
Write(ms.ToArray());
225+
Write(ms.GetBufferSegment());
226226
}
227227

228228
public void WriteFrame(OutboundFrame frame)
@@ -231,7 +231,7 @@ public void WriteFrame(OutboundFrame frame)
231231
var nbw = new NetworkBinaryWriter(ms);
232232
frame.WriteTo(nbw);
233233
m_socket.Client.Poll(m_writeableStateTimeout, SelectMode.SelectWrite);
234-
Write(ms.ToArray());
234+
Write(ms.GetBufferSegment());
235235
}
236236

237237
public void WriteFrameSet(IList<OutboundFrame> frames)
@@ -240,21 +240,21 @@ public void WriteFrameSet(IList<OutboundFrame> frames)
240240
var nbw = new NetworkBinaryWriter(ms);
241241
foreach (var f in frames) f.WriteTo(nbw);
242242
m_socket.Client.Poll(m_writeableStateTimeout, SelectMode.SelectWrite);
243-
Write(ms.ToArray());
243+
Write(ms.GetBufferSegment());
244244
}
245245

246-
private void Write(byte [] buffer)
246+
private void Write(ArraySegment<byte> bufferSegment)
247247
{
248248
if(_ssl)
249249
{
250250
lock (_sslStreamLock)
251251
{
252-
m_writer.Write(buffer);
252+
m_writer.Write(bufferSegment.Array, bufferSegment.Offset, bufferSegment.Count);
253253
}
254254
}
255255
else
256256
{
257-
m_writer.Write(buffer);
257+
m_writer.Write(bufferSegment.Array, bufferSegment.Offset, bufferSegment.Count);
258258
}
259259
}
260260

0 commit comments

Comments
 (0)