Skip to content

Commit ac2cc85

Browse files
committed
Caching read buffer.
1 parent f9995c4 commit ac2cc85

File tree

1 file changed

+15
-12
lines changed
  • Provider/src/FirebirdSql.Data.FirebirdClient/Client/Managed

1 file changed

+15
-12
lines changed

Provider/src/FirebirdSql.Data.FirebirdClient/Client/Managed/XdrStream.cs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ internal class XdrStream : Stream
4848
private long _position;
4949
private List<byte> _outputBuffer;
5050
private Queue<byte> _inputBuffer;
51+
private byte[] _readBuffer;
5152
private byte[] _smallBuffer;
5253
private Ionic.Zlib.ZlibCodec _deflate;
5354
private Ionic.Zlib.ZlibCodec _inflate;
@@ -122,6 +123,7 @@ public XdrStream(Stream innerStream, Charset charset, bool compression, bool own
122123
_position = 0;
123124
_outputBuffer = new List<byte>(PreferredBufferSize);
124125
_inputBuffer = new Queue<byte>(PreferredBufferSize);
126+
_readBuffer = new byte[PreferredBufferSize];
125127
_smallBuffer = new byte[8];
126128
if (_compression)
127129
{
@@ -160,7 +162,8 @@ public override void Flush()
160162
var count = buffer.Length;
161163
if (_compression)
162164
{
163-
HandleCompression(ref buffer, ref count);
165+
count = HandleCompression(buffer, count);
166+
buffer = _compressionBuffer;
164167
}
165168
try
166169
{
@@ -203,7 +206,7 @@ public override int Read(byte[] buffer, int offset, int count)
203206

204207
if (_inputBuffer.Count < count)
205208
{
206-
var readBuffer = new byte[PreferredBufferSize];
209+
var readBuffer = _readBuffer;
207210
var read = default(int);
208211
try
209212
{
@@ -218,7 +221,8 @@ public override int Read(byte[] buffer, int offset, int count)
218221
{
219222
if (_compression)
220223
{
221-
HandleDecompression(ref readBuffer, ref read);
224+
read = HandleDecompression(readBuffer, read);
225+
readBuffer = _compressionBuffer;
222226
}
223227
WriteToInputBuffer(readBuffer, read);
224228
}
@@ -235,7 +239,7 @@ public override async Task<int> ReadAsync(byte[] buffer, int offset, int count,
235239

236240
if (_inputBuffer.Count < count)
237241
{
238-
var readBuffer = new byte[PreferredBufferSize];
242+
var readBuffer = _readBuffer;
239243
var read = default(int);
240244
try
241245
{
@@ -250,7 +254,8 @@ public override async Task<int> ReadAsync(byte[] buffer, int offset, int count,
250254
{
251255
if (_compression)
252256
{
253-
HandleDecompression(ref readBuffer, ref read);
257+
read = HandleDecompression(readBuffer, read);
258+
readBuffer = _compressionBuffer;
254259
}
255260
WriteToInputBuffer(readBuffer, read);
256261
}
@@ -737,7 +742,7 @@ private void WriteToInputBuffer(byte[] data, int count)
737742
}
738743
}
739744

740-
private void HandleDecompression(ref byte[] buffer, ref int count)
745+
private int HandleDecompression(byte[] buffer, int count)
741746
{
742747
_inflate.OutputBuffer = _compressionBuffer;
743748
_inflate.AvailableBytesOut = _compressionBuffer.Length;
@@ -750,25 +755,23 @@ private void HandleDecompression(ref byte[] buffer, ref int count)
750755
throw new IOException($"Error '{rc}' while decompressing the data.");
751756
if (_inflate.AvailableBytesIn != 0)
752757
throw new IOException("Decompression buffer too small.");
753-
buffer = _compressionBuffer;
754-
count = _inflate.NextOut;
758+
return _inflate.NextOut;
755759
}
756760

757-
private void HandleCompression(ref byte[] buffer, ref int count)
761+
private int HandleCompression(byte[] buffer, int count)
758762
{
759763
_deflate.OutputBuffer = _compressionBuffer;
760764
_deflate.AvailableBytesOut = _compressionBuffer.Length;
761765
_deflate.NextOut = 0;
762766
_deflate.InputBuffer = buffer;
763-
_deflate.AvailableBytesIn = buffer.Length;
767+
_deflate.AvailableBytesIn = count;
764768
_deflate.NextIn = 0;
765769
var rc = _deflate.Deflate(Ionic.Zlib.FlushType.Sync);
766770
if (rc != Ionic.Zlib.ZlibConstants.Z_OK)
767771
throw new IOException($"Error '{rc}' while compressing the data.");
768772
if (_deflate.AvailableBytesIn != 0)
769773
throw new IOException("Compression buffer too small.");
770-
buffer = _compressionBuffer;
771-
count = _deflate.NextOut;
774+
return _deflate.NextOut;
772775
}
773776

774777
private readonly static byte[] PadArray = new byte[] { 0, 0, 0, 0 };

0 commit comments

Comments
 (0)