Make GetMemory use MaxBufferSize for MemoryPool (#7143)
This commit is contained in:
parent
1d2838ea2e
commit
9251dfe7c0
|
|
@ -278,7 +278,8 @@ namespace System.IO.Pipelines
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get a new buffer using the minimum segment size, unless the size hint is larger than a single segment.
|
// Get a new buffer using the minimum segment size, unless the size hint is larger than a single segment.
|
||||||
_currentSegmentOwner = _pool.Rent(Math.Max(_minimumSegmentSize, sizeHint));
|
// Also, the size cannot be larger than the MaxBufferSize of the MemoryPool
|
||||||
|
_currentSegmentOwner = _pool.Rent(Math.Clamp(sizeHint, _minimumSegmentSize, _pool.MaxBufferSize));
|
||||||
_currentSegment = _currentSegmentOwner.Memory;
|
_currentSegment = _currentSegmentOwner.Memory;
|
||||||
_position = 0;
|
_position = 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -89,14 +89,14 @@ namespace System.IO.Pipelines.Tests
|
||||||
Assert.Equal(memory, secondMemory);
|
Assert.Equal(memory, secondMemory);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Theory]
|
||||||
public void CanGetNewSpanWhenNoAdvanceWhenSizeTooLarge()
|
[InlineData(0)]
|
||||||
|
[InlineData(2048)]
|
||||||
|
public void GetSpanWithZeroSizeHintReturnsMaxBufferSizeOfPool(int sizeHint)
|
||||||
{
|
{
|
||||||
var span = Writer.GetSpan(0);
|
var span = Writer.GetSpan(sizeHint);
|
||||||
|
|
||||||
var secondSpan = Writer.GetSpan(10000);
|
Assert.Equal(4096, span.Length);
|
||||||
|
|
||||||
Assert.False(span.SequenceEqual(secondSpan));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ namespace System.IO.Pipelines.Tests
|
||||||
[InlineData(8000, 8000)]
|
[InlineData(8000, 8000)]
|
||||||
public async Task CanAdvanceWithPartialConsumptionOfFirstSegment(int firstWriteLength, int secondWriteLength)
|
public async Task CanAdvanceWithPartialConsumptionOfFirstSegment(int firstWriteLength, int secondWriteLength)
|
||||||
{
|
{
|
||||||
|
Writer = new StreamPipeWriter(MemoryStream, MinimumSegmentSize, new TestMemoryPool(maxBufferSize: 20000));
|
||||||
await Writer.WriteAsync(Encoding.ASCII.GetBytes("a"));
|
await Writer.WriteAsync(Encoding.ASCII.GetBytes("a"));
|
||||||
|
|
||||||
var expectedLength = firstWriteLength + secondWriteLength + 1;
|
var expectedLength = firstWriteLength + secondWriteLength + 1;
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,14 @@ namespace System.IO.Pipelines.Tests
|
||||||
public class TestMemoryPool : MemoryPool<byte>
|
public class TestMemoryPool : MemoryPool<byte>
|
||||||
{
|
{
|
||||||
private MemoryPool<byte> _pool;
|
private MemoryPool<byte> _pool;
|
||||||
|
private int _maxBufferSize;
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
private int _rentCount;
|
private int _rentCount;
|
||||||
public TestMemoryPool()
|
|
||||||
|
public TestMemoryPool(int maxBufferSize = 4096)
|
||||||
{
|
{
|
||||||
_pool = new CustomMemoryPool<byte>();
|
_pool = new CustomMemoryPool<byte>();
|
||||||
|
_maxBufferSize = maxBufferSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IMemoryOwner<byte> Rent(int minBufferSize = -1)
|
public override IMemoryOwner<byte> Rent(int minBufferSize = -1)
|
||||||
|
|
@ -39,7 +41,7 @@ namespace System.IO.Pipelines.Tests
|
||||||
_disposed = true;
|
_disposed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override int MaxBufferSize => 4096;
|
public override int MaxBufferSize => _maxBufferSize;
|
||||||
|
|
||||||
internal void CheckDisposed()
|
internal void CheckDisposed()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue