internal void Free(PoolChunk <T> chunk, long handle, int normCapacity, PoolThreadCache <T> cache) { if (chunk.Unpooled) { int size = chunk.ChunkSize; DestroyChunk(chunk); _ = Interlocked.Add(ref _activeBytesHuge, -size); _ = Interlocked.Increment(ref _deallocationsHuge); } else { SizeClass sizeClass = SizeClass(normCapacity); if (cache is object && cache.Add(this, chunk, handle, normCapacity, sizeClass)) { // cached so not free it. return; } FreeChunk(chunk, handle, sizeClass, false); } }
internal void Free(PoolChunk <T> chunk, long handle, int normCapacity, PoolThreadCache <T> cache) { if (chunk.Unpooled) { int size = chunk.ChunkSize; this.DestroyChunk(chunk); Interlocked.Add(ref this.activeBytesHuge, -size); Interlocked.Decrement(ref this.deallocationsHuge); } else { SizeClass sc = this.SizeClass(normCapacity); if (cache != null && cache.Add(this, chunk, handle, normCapacity, sc)) { // cached so not free it. return; } this.FreeChunk(chunk, handle, sc); } }