Skip to content

Commit 0fc8e0e

Browse files
author
yupliner
committed
Don't call MemoryStream.ToArray, don't create MemoryStream, NetworkBinaryWriter
1 parent 9f6715a commit 0fc8e0e

File tree

2 files changed

+66
-55
lines changed

2 files changed

+66
-55
lines changed

projects/client/RabbitMQ.Client/RabbitMQ.Client.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@
4040
<DefineConstants>$(DefineConstants);CORECLR</DefineConstants>
4141
</PropertyGroup>
4242

43+
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard1.5'">
44+
<DefineConstants>$(DefineConstants);CORECLR15</DefineConstants>
45+
</PropertyGroup>
46+
4347
<PropertyGroup Condition=" '$(Configuration)' == 'SignedRelease' ">
4448
<DelaySign>true</DelaySign>
4549
<OutputType>Library</OutputType>

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

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -56,98 +56,115 @@ namespace RabbitMQ.Client.Impl
5656
{
5757
public class HeaderOutboundFrame : OutboundFrame
5858
{
59+
private readonly ContentHeaderBase header;
60+
private readonly int bodyLength;
61+
5962
public HeaderOutboundFrame(int channel, ContentHeaderBase header, int bodyLength) : base(FrameType.FrameHeader, channel)
6063
{
61-
NetworkBinaryWriter writer = base.GetWriter();
64+
this.header = header;
65+
this.bodyLength = bodyLength;
66+
}
67+
68+
public override void WritePayload(NetworkBinaryWriter writer)
69+
{
70+
var ms = new MemoryStream();
71+
var nw = new NetworkBinaryWriter(ms);
6272

63-
writer.Write(header.ProtocolClassId);
64-
header.WriteTo(writer, (ulong)bodyLength);
73+
nw.Write(header.ProtocolClassId);
74+
header.WriteTo(nw, (ulong)bodyLength);
75+
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
6585
}
6686
}
6787

6888
public class BodySegmentOutboundFrame : OutboundFrame
6989
{
90+
private readonly byte[] body;
91+
private readonly int offset;
92+
private readonly int count;
93+
7094
public BodySegmentOutboundFrame(int channel, byte[] body, int offset, int count) : base(FrameType.FrameBody, channel)
7195
{
72-
NetworkBinaryWriter writer = base.GetWriter();
96+
this.body = body;
97+
this.offset = offset;
98+
this.count = count;
99+
}
73100

101+
public override void WritePayload(NetworkBinaryWriter writer)
102+
{
103+
writer.Write((uint)count);
74104
writer.Write(body, offset, count);
75105
}
76106
}
77107

78108
public class MethodOutboundFrame : OutboundFrame
79109
{
110+
private readonly MethodBase method;
111+
80112
public MethodOutboundFrame(int channel, MethodBase method) : base(FrameType.FrameMethod, channel)
81113
{
82-
NetworkBinaryWriter writer = base.GetWriter();
114+
this.method = method;
115+
}
83116

84-
writer.Write(method.ProtocolClassId);
85-
writer.Write(method.ProtocolMethodId);
117+
public override void WritePayload(NetworkBinaryWriter writer)
118+
{
119+
var ms = new MemoryStream();
120+
var nw = new NetworkBinaryWriter(ms);
86121

87-
var argWriter = new MethodArgumentWriter(writer);
122+
nw.Write(method.ProtocolClassId);
123+
nw.Write(method.ProtocolMethodId);
88124

125+
var argWriter = new MethodArgumentWriter(nw);
89126
method.WriteArgumentsTo(argWriter);
90-
91127
argWriter.Flush();
128+
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
92138
}
93139
}
94140

95141
public class EmptyOutboundFrame : OutboundFrame
96142
{
97-
private static readonly byte[] m_emptyByteArray = new byte[0];
98-
99143
public EmptyOutboundFrame() : base(FrameType.FrameHeartbeat, 0)
100144
{
101-
base.GetWriter().Write(m_emptyByteArray);
102145
}
103146

104-
public override string ToString()
147+
public override void WritePayload(NetworkBinaryWriter writer)
105148
{
106-
return base.ToString() + string.Format("(type={0}, channel={1}, {2} bytes of payload)",
107-
Type,
108-
Channel,
109-
Payload == null
110-
? "(null)"
111-
: Payload.Length.ToString());
149+
writer.Write((uint)0);
112150
}
113151
}
114152

115-
public class OutboundFrame : Frame
153+
public abstract class OutboundFrame : Frame
116154
{
117-
private readonly MemoryStream m_accumulator;
118-
private readonly NetworkBinaryWriter writer;
119-
120155
public OutboundFrame(FrameType type, int channel) : base(type, channel)
121156
{
122-
m_accumulator = new MemoryStream();
123-
writer = new NetworkBinaryWriter(m_accumulator);
124-
}
125-
126-
public NetworkBinaryWriter GetWriter()
127-
{
128-
return writer;
129-
}
130-
131-
public override string ToString()
132-
{
133-
return base.ToString() + string.Format("(type={0}, channel={1}, {2} bytes of payload)",
134-
Type,
135-
Channel,
136-
Payload == null
137-
? "(null)"
138-
: Payload.Length.ToString());
139157
}
140158

141159
public void WriteTo(NetworkBinaryWriter writer)
142160
{
143-
var payload = m_accumulator.ToArray();
144-
145161
writer.Write((byte)Type);
146162
writer.Write((ushort)Channel);
147-
writer.Write((uint)payload.Length);
148-
writer.Write(payload);
163+
WritePayload(writer);
149164
writer.Write((byte)Constants.FrameEnd);
150165
}
166+
167+
public abstract void WritePayload(NetworkBinaryWriter writer);
151168
}
152169

153170
public class InboundFrame : Frame
@@ -252,16 +269,6 @@ public NetworkBinaryReader GetReader()
252269
{
253270
return new NetworkBinaryReader(new MemoryStream(base.Payload));
254271
}
255-
256-
public override string ToString()
257-
{
258-
return base.ToString() + string.Format("(type={0}, channel={1}, {2} bytes of payload)",
259-
base.Type,
260-
base.Channel,
261-
base.Payload == null
262-
? "(null)"
263-
: base.Payload.Length.ToString());
264-
}
265272
}
266273

267274
public class Frame
@@ -288,7 +295,7 @@ public Frame(FrameType type, int channel, byte[] payload)
288295

289296
public override string ToString()
290297
{
291-
return base.ToString() + string.Format("(type={0}, channel={1}, {2} bytes of payload)",
298+
return string.Format("(type={0}, channel={1}, {2} bytes of payload)",
292299
Type,
293300
Channel,
294301
Payload == null

0 commit comments

Comments
 (0)