Skip to content

Commit 9251dfe

Browse files
authored
Make GetMemory use MaxBufferSize for MemoryPool (#7143)
1 parent 1d2838e commit 9251dfe

File tree

4 files changed

+14
-10
lines changed

4 files changed

+14
-10
lines changed

src/Http/Http/src/StreamPipeWriter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,8 @@ private void AddSegment(int sizeHint = 0)
278278
}
279279

280280
// Get a new buffer using the minimum segment size, unless the size hint is larger than a single segment.
281-
_currentSegmentOwner = _pool.Rent(Math.Max(_minimumSegmentSize, sizeHint));
281+
// Also, the size cannot be larger than the MaxBufferSize of the MemoryPool
282+
_currentSegmentOwner = _pool.Rent(Math.Clamp(sizeHint, _minimumSegmentSize, _pool.MaxBufferSize));
282283
_currentSegment = _currentSegmentOwner.Memory;
283284
_position = 0;
284285
}

src/Http/Http/test/PipeWriterTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,14 @@ public void CanGetSameMemoryWhenNoAdvance()
8989
Assert.Equal(memory, secondMemory);
9090
}
9191

92-
[Fact]
93-
public void CanGetNewSpanWhenNoAdvanceWhenSizeTooLarge()
92+
[Theory]
93+
[InlineData(0)]
94+
[InlineData(2048)]
95+
public void GetSpanWithZeroSizeHintReturnsMaxBufferSizeOfPool(int sizeHint)
9496
{
95-
var span = Writer.GetSpan(0);
96-
97-
var secondSpan = Writer.GetSpan(10000);
97+
var span = Writer.GetSpan(sizeHint);
9898

99-
Assert.False(span.SequenceEqual(secondSpan));
99+
Assert.Equal(4096, span.Length);
100100
}
101101

102102
[Fact]

src/Http/Http/test/StreamPipeWriterTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public async Task CanWriteAsyncMultipleTimesIntoSameBlock()
3232
[InlineData(8000, 8000)]
3333
public async Task CanAdvanceWithPartialConsumptionOfFirstSegment(int firstWriteLength, int secondWriteLength)
3434
{
35+
Writer = new StreamPipeWriter(MemoryStream, MinimumSegmentSize, new TestMemoryPool(maxBufferSize: 20000));
3536
await Writer.WriteAsync(Encoding.ASCII.GetBytes("a"));
3637

3738
var expectedLength = firstWriteLength + secondWriteLength + 1;

src/Http/Http/test/TestMemoryPool.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ namespace System.IO.Pipelines.Tests
1414
public class TestMemoryPool : MemoryPool<byte>
1515
{
1616
private MemoryPool<byte> _pool;
17-
17+
private int _maxBufferSize;
1818
private bool _disposed;
1919
private int _rentCount;
20-
public TestMemoryPool()
20+
21+
public TestMemoryPool(int maxBufferSize = 4096)
2122
{
2223
_pool = new CustomMemoryPool<byte>();
24+
_maxBufferSize = maxBufferSize;
2325
}
2426

2527
public override IMemoryOwner<byte> Rent(int minBufferSize = -1)
@@ -39,7 +41,7 @@ protected override void Dispose(bool disposing)
3941
_disposed = true;
4042
}
4143

42-
public override int MaxBufferSize => 4096;
44+
public override int MaxBufferSize => _maxBufferSize;
4345

4446
internal void CheckDisposed()
4547
{

0 commit comments

Comments
 (0)