/// <summary> /// This object cannot be instantiated outside of the static Create method /// </summary> protected MemoryPoolBlock(MemoryPool pool, MemoryPoolSlab slab, int offset, int length) { _offset = offset; _length = length; Pool = pool; Slab = slab; }
/// <summary> /// This object cannot be instantiated outside of the static Create method /// </summary> protected MemoryPoolBlock(MemoryPool pool, MemoryPoolSlab slab, int offset, int length) : base(slab.Array, offset, length, slab.NativePointer + offset) { _offset = offset; _length = length; Pool = pool; Slab = slab; }
internal static MemoryPoolBlock Create( int offset, int length, MemoryPool pool, MemoryPoolSlab slab) { return(new MemoryPoolBlock(pool, slab, offset, length)); }
internal static MemoryPoolBlock Create( int offset, int length, MemoryPool pool, MemoryPoolSlab slab) { return(new MemoryPoolBlock(pool, slab, offset, length) { #if BLOCK_LEASE_TRACKING Leaser = Environment.StackTrace, #endif }); }
/// <summary> /// Internal method called when a block is requested and the pool is empty. It allocates one additional slab, creates all of the /// block tracking objects, and adds them all to the pool. /// </summary> private MemoryPoolBlock AllocateSlab() { var slab = MemoryPoolSlab.Create(_slabLength); _slabs.Push(slab); _slabAllocationCallback?.Invoke(slab); slab._deallocationCallback = _slabDeallocationCallback; var basePtr = slab.NativePointer; var firstOffset = (int)((_blockStride - 1) - ((ulong)(basePtr + _blockStride - 1) % _blockStride)); var poolAllocationLength = _slabLength - _blockStride; var offset = firstOffset; for (; offset + _blockLength < poolAllocationLength; offset += _blockStride) { var block = MemoryPoolBlock.Create( offset, _blockLength, this, slab); #if DEBUG block.IsLeased = true; #endif Return(block); } // return last block rather than adding to pool var newBlock = MemoryPoolBlock.Create( offset, _blockLength, this, slab); return(newBlock); }