internal void ReturnLargeBuffer(byte[] buffer)
        {
            if (buffer == null)
            {
                throw new ArgumentNullException(nameof(buffer));
            }
            if (!IsLargeBufferMultiple(buffer.Length))
            {
                throw new ArgumentException("buffer did not originate from this memory manager. The size is not a multiple of " + LargeBufferMultiple);
            }

            var num = buffer.Length / largeBufferMultiple - 1;

            if (num < largePools.Length)
            {
                if ((largePools[num].Count + 1) * buffer.Length <= MaximumFreeLargePoolBytes || MaximumFreeLargePoolBytes == 0)
                {
                    largePools[num].Push(buffer);
                    Interlocked.Add(ref largeBufferFreeSize[num], buffer.Length);
                }
                else
                {
                    LargeBufferDiscarded?.Invoke(MemoryStreamDiscardReason.EnoughFree);
                }
            }
            else
            {
                num = largeBufferInUseSize.Length - 1;
                LargeBufferDiscarded?.Invoke(MemoryStreamDiscardReason.TooLarge);
            }

            Interlocked.Add(ref largeBufferInUseSize[num], -buffer.Length);
            UsageReport?.Invoke(smallPoolInUseSize, smallPoolFreeSize, LargePoolInUseSize, LargePoolFreeSize);
        }
Пример #2
0
 internal void ReportLargeBufferDiscarded(Events.MemoryStreamDiscardReason reason)
 {
     Counter.ReportLargeBufferDiscarded();
     LargeBufferDiscarded?.Invoke(reason);
 }
 internal void ReportLargeBufferDiscarded(MemoryStreamEvents.MemoryStreamDiscardReason reason)
 {
     LargeBufferDiscarded?.Invoke(reason);
 }