using System;
using System.Buffers;
using System.Threading;
namespace Ryujinx.Common.Memory
{
public sealed partial class ByteMemoryPool
{
///
/// Represents a that wraps an array rented from
/// and exposes it as
/// with a length of the requested size.
///
private sealed class ByteMemoryPoolBuffer : IMemoryOwner
{
private byte[] _array;
private readonly int _length;
public ByteMemoryPoolBuffer(int length)
{
_array = ArrayPool.Shared.Rent(length);
_length = length;
}
///
/// Returns a belonging to this owner.
///
public Memory Memory
{
get
{
byte[] array = _array;
ObjectDisposedException.ThrowIf(array is null, this);
return new Memory(array, 0, _length);
}
}
public void Dispose()
{
var array = Interlocked.Exchange(ref _array, null);
if (array != null)
{
ArrayPool.Shared.Return(array);
}
}
}
}
}