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);
        }
Esempio n. 2
0
 internal void ReportBlockDiscarded()
 {
     Counter.ReportBlockDiscarded();
     BlockDiscarded?.Invoke();
 }
 internal void ReportBlockDiscarded() => BlockDiscarded?.Invoke();
Esempio n. 4
0
 internal void ReportBlockDiscarded(string?tag) => BlockDiscarded?.Invoke(tag);