public override MemoryHandle Pin(int byteOffset = 0) { try { lock (_syncObj) { if (_isDisposed) { MemoryPoolThrowHelper.ThrowObjectDisposedException(MemoryPoolThrowHelper.ExceptionArgument.MemoryPoolBlock); } if (_pool.IsDisposed) { MemoryPoolThrowHelper.ThrowInvalidOperationException_BlockIsBackedByDisposedSlab(this); } if (byteOffset < 0 || byteOffset > _memory.Length) { MemoryPoolThrowHelper.ThrowArgumentOutOfRangeException(_memory.Length, byteOffset); } _pinCount++; _memoryHandle = _memoryHandle ?? _memory.Pin(); unsafe { return(new MemoryHandle(((IntPtr)_memoryHandle.Value.Pointer + byteOffset).ToPointer(), default, this));
public override IMemoryOwner <byte> Rent(int size = AnySize) { lock (_syncObj) { if (IsDisposed) { MemoryPoolThrowHelper.ThrowObjectDisposedException(MemoryPoolThrowHelper.ExceptionArgument.MemoryPool); } var diagnosticPoolBlock = new DiagnosticPoolBlock(this, _pool.Rent(size)); if (_rentTracking) { diagnosticPoolBlock.Track(); } _totalBlocks++; _blocks.Add(diagnosticPoolBlock); return(diagnosticPoolBlock); } }
/// <summary> /// Called to take a block from the pool. /// </summary> /// <returns>The block that is reserved for the called. It must be passed to Return when it is no longer being used.</returns> private MemoryPoolBlock Lease() { if (_isDisposed) { MemoryPoolThrowHelper.ThrowObjectDisposedException(MemoryPoolThrowHelper.ExceptionArgument.MemoryPool); } if (_blocks.TryDequeue(out MemoryPoolBlock block)) { // block successfully taken from the stack - return it block.Lease(); return(block); } // no blocks available - grow the pool block = AllocateSlab(); block.Lease(); return(block); }
public override Span <byte> GetSpan() { try { lock (_syncObj) { if (_isDisposed) { MemoryPoolThrowHelper.ThrowObjectDisposedException(MemoryPoolThrowHelper.ExceptionArgument.MemoryPoolBlock); } if (_pool.IsDisposed) { MemoryPoolThrowHelper.ThrowInvalidOperationException_BlockIsBackedByDisposedSlab(this); } return(_memory.Span); } } catch (Exception exception) { _pool.ReportException(exception); throw; } }