Removed BufferSegment (#10982)
- This was leftover from the old StreamPipeReader impl
This commit is contained in:
parent
5d091df908
commit
b34acc9e86
|
|
@ -1,135 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System.Buffers;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
|
|
||||||
namespace System.IO.Pipelines
|
|
||||||
{
|
|
||||||
internal sealed class BufferSegment : ReadOnlySequenceSegment<byte>
|
|
||||||
{
|
|
||||||
private object _memoryOwner;
|
|
||||||
private BufferSegment _next;
|
|
||||||
private int _end;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The End represents the offset into AvailableMemory where the range of "active" bytes ends. At the point when the block is leased
|
|
||||||
/// the End is guaranteed to be equal to Start. The value of Start may be assigned anywhere between 0 and
|
|
||||||
/// Buffer.Length, and must be equal to or less than End.
|
|
||||||
/// </summary>
|
|
||||||
public int End
|
|
||||||
{
|
|
||||||
get => _end;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Debug.Assert(value <= AvailableMemory.Length);
|
|
||||||
|
|
||||||
_end = value;
|
|
||||||
Memory = AvailableMemory.Slice(0, _end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Reference to the next block of data when the overall "active" bytes spans multiple blocks. At the point when the block is
|
|
||||||
/// leased Next is guaranteed to be null. Start, End, and Next are used together in order to create a linked-list of discontiguous
|
|
||||||
/// working memory. The "active" memory is grown when bytes are copied in, End is increased, and Next is assigned. The "active"
|
|
||||||
/// memory is shrunk when bytes are consumed, Start is increased, and blocks are returned to the pool.
|
|
||||||
/// </summary>
|
|
||||||
public BufferSegment NextSegment
|
|
||||||
{
|
|
||||||
get => _next;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_next = value;
|
|
||||||
Next = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetMemory(object memoryOwner)
|
|
||||||
{
|
|
||||||
if (memoryOwner is IMemoryOwner<byte> owner)
|
|
||||||
{
|
|
||||||
SetMemory(owner);
|
|
||||||
}
|
|
||||||
else if (memoryOwner is byte[] array)
|
|
||||||
{
|
|
||||||
SetMemory(array);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Fail("Unexpected memoryOwner");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetMemory(IMemoryOwner<byte> memoryOwner)
|
|
||||||
{
|
|
||||||
_memoryOwner = memoryOwner;
|
|
||||||
|
|
||||||
SetUnownedMemory(memoryOwner.Memory);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetMemory(byte[] arrayPoolBuffer)
|
|
||||||
{
|
|
||||||
_memoryOwner = arrayPoolBuffer;
|
|
||||||
|
|
||||||
SetUnownedMemory(arrayPoolBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
public void SetUnownedMemory(Memory<byte> memory)
|
|
||||||
{
|
|
||||||
AvailableMemory = memory;
|
|
||||||
RunningIndex = 0;
|
|
||||||
End = 0;
|
|
||||||
NextSegment = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ResetMemory()
|
|
||||||
{
|
|
||||||
if (_memoryOwner is IMemoryOwner<byte> owner)
|
|
||||||
{
|
|
||||||
owner.Dispose();
|
|
||||||
}
|
|
||||||
else if (_memoryOwner is byte[] array)
|
|
||||||
{
|
|
||||||
ArrayPool<byte>.Shared.Return(array);
|
|
||||||
}
|
|
||||||
|
|
||||||
_memoryOwner = null;
|
|
||||||
AvailableMemory = default;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exposed for testing
|
|
||||||
internal object MemoryOwner => _memoryOwner;
|
|
||||||
|
|
||||||
public Memory<byte> AvailableMemory { get; private set; }
|
|
||||||
|
|
||||||
public int Length => End;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The amount of writable bytes in this segment. It is the amount of bytes between Length and End
|
|
||||||
/// </summary>
|
|
||||||
public int WritableBytes
|
|
||||||
{
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
get => AvailableMemory.Length - End;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetNext(BufferSegment segment)
|
|
||||||
{
|
|
||||||
Debug.Assert(segment != null);
|
|
||||||
Debug.Assert(Next == null);
|
|
||||||
|
|
||||||
NextSegment = segment;
|
|
||||||
|
|
||||||
segment = this;
|
|
||||||
|
|
||||||
while (segment.Next != null)
|
|
||||||
{
|
|
||||||
segment.NextSegment.RunningIndex = segment.RunningIndex + segment.Length;
|
|
||||||
segment = segment.NextSegment;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue