in src/Elastic.Transport/Components/Providers/RecyclableMemoryStreamManager.cs [128:166]
public RecyclableMemoryStreamManager(int blockSize, int largeBufferMultiple, int maximumBufferSize, bool useExponentialLargeBuffer)
{
if (blockSize <= 0) throw new ArgumentOutOfRangeException(nameof(blockSize), blockSize, "blockSize must be a positive number");
if (largeBufferMultiple <= 0)
throw new ArgumentOutOfRangeException(nameof(largeBufferMultiple),
"largeBufferMultiple must be a positive number");
if (maximumBufferSize < blockSize)
throw new ArgumentOutOfRangeException(nameof(maximumBufferSize),
"maximumBufferSize must be at least blockSize");
BlockSize = blockSize;
LargeBufferMultiple = largeBufferMultiple;
MaximumBufferSize = maximumBufferSize;
UseExponentialLargeBuffer = useExponentialLargeBuffer;
if (!IsLargeBufferSize(maximumBufferSize))
throw new ArgumentException(string.Format("maximumBufferSize is not {0} of largeBufferMultiple",
UseExponentialLargeBuffer ? "an exponential" : "a multiple"),
nameof(maximumBufferSize));
_smallPool = new ConcurrentStack<byte[]>();
var numLargePools = useExponentialLargeBuffer
// ReSharper disable once PossibleLossOfFraction
// Not our code assume loss is intentional
? (int)Math.Log(maximumBufferSize / largeBufferMultiple, 2) + 1
: maximumBufferSize / largeBufferMultiple;
// +1 to store size of bytes in use that are too large to be pooled
_largeBufferInUseSize = new long[numLargePools + 1];
_largeBufferFreeSize = new long[numLargePools];
_largePools = new ConcurrentStack<byte[]>[numLargePools];
for (var i = 0; i < _largePools.Length; ++i) _largePools[i] = new ConcurrentStack<byte[]>();
EventsWriter.MemoryStreamManagerInitialized(blockSize, largeBufferMultiple, maximumBufferSize);
}