in src/RecyclableMemoryStreamManager.cs [169:227]
public RecyclableMemoryStreamManager(int blockSize, int largeBufferMultiple, int maximumBufferSize, bool useExponentialLargeBuffer, long maximumSmallPoolFreeBytes, long maximumLargePoolFreeBytes)
{
if (blockSize <= 0)
{
throw new ArgumentOutOfRangeException(nameof(blockSize), blockSize, $"{nameof(blockSize)} must be a positive number");
}
if (largeBufferMultiple <= 0)
{
throw new ArgumentOutOfRangeException(nameof(largeBufferMultiple), $"{nameof(largeBufferMultiple)} must be a positive number");
}
if (maximumBufferSize < blockSize)
{
throw new ArgumentOutOfRangeException(nameof(maximumBufferSize), $"{nameof(maximumBufferSize)} must be at least {nameof(blockSize)}");
}
if (maximumSmallPoolFreeBytes < 0)
{
throw new ArgumentOutOfRangeException(nameof(maximumSmallPoolFreeBytes), $"{nameof(maximumSmallPoolFreeBytes)} must be non-negative");
}
if (maximumLargePoolFreeBytes < 0)
{
throw new ArgumentOutOfRangeException(nameof(maximumLargePoolFreeBytes), $"{nameof(maximumLargePoolFreeBytes)} must be non-negative");
}
this.BlockSize = blockSize;
this.LargeBufferMultiple = largeBufferMultiple;
this.MaximumBufferSize = maximumBufferSize;
this.UseExponentialLargeBuffer = useExponentialLargeBuffer;
this.MaximumFreeSmallPoolBytes = maximumSmallPoolFreeBytes;
this.MaximumFreeLargePoolBytes = maximumLargePoolFreeBytes;
if (!this.IsLargeBufferSize(maximumBufferSize))
{
throw new ArgumentException(
$"{nameof(maximumBufferSize)} is not {(this.UseExponentialLargeBuffer ? "an exponential" : "a multiple")} of {nameof(largeBufferMultiple)}.",
nameof(maximumBufferSize));
}
this.smallPool = new ConcurrentStack<byte[]>();
var numLargePools = useExponentialLargeBuffer
? ((int)Math.Log(maximumBufferSize / largeBufferMultiple, 2) + 1)
: (maximumBufferSize / largeBufferMultiple);
// +1 to store size of bytes in use that are too large to be pooled
this.largeBufferInUseSize = new long[numLargePools + 1];
this.largeBufferFreeSize = new long[numLargePools];
this.largePools = new ConcurrentStack<byte[]>[numLargePools];
for (var i = 0; i < this.largePools.Length; ++i)
{
this.largePools[i] = new ConcurrentStack<byte[]>();
}
Events.Writer.MemoryStreamManagerInitialized(blockSize, largeBufferMultiple, maximumBufferSize);
}