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); }
internal void ReportLargeBufferDiscarded(Events.MemoryStreamDiscardReason reason) { Counter.ReportLargeBufferDiscarded(); LargeBufferDiscarded?.Invoke(reason); }
internal void ReportLargeBufferDiscarded(MemoryStreamEvents.MemoryStreamDiscardReason reason) { LargeBufferDiscarded?.Invoke(reason); }