internal void ReturnBlocks(ICollection <byte[]> blocks) { if (blocks == null) { throw new ArgumentNullException(nameof(blocks)); } var num = blocks.Count * BlockSize; Interlocked.Add(ref smallPoolInUseSize, -num); foreach (var block in blocks) { if (block == null || block.Length != BlockSize) { throw new ArgumentException("blocks contains buffers that are not BlockSize in length"); } } foreach (byte[] block2 in blocks) { if (MaximumFreeSmallPoolBytes != 0 && SmallPoolFreeSize >= MaximumFreeSmallPoolBytes) { BlockDiscarded?.Invoke(); break; } Interlocked.Add(ref smallPoolFreeSize, BlockSize); smallPool.Push(block2); } UsageReport?.Invoke(smallPoolInUseSize, smallPoolFreeSize, LargePoolInUseSize, LargePoolFreeSize); }
internal void ReportBlockDiscarded() { Counter.ReportBlockDiscarded(); BlockDiscarded?.Invoke(); }
internal void ReportBlockDiscarded() => BlockDiscarded?.Invoke();
internal void ReportBlockDiscarded(string?tag) => BlockDiscarded?.Invoke(tag);