public override void Retain() { if (IsDisposed) { RioPipelinesThrowHelper.ThrowObjectDisposedException(nameof(RioMemoryPoolBlock)); } Interlocked.Increment(ref _referenceCount); }
public override Span <byte> GetSpan() { if (IsDisposed) { RioPipelinesThrowHelper.ThrowObjectDisposedException(nameof(RioMemoryPoolBlock)); } return(new Span <byte>(Slab.Array, _offset, _length)); }
// In kestrel both MemoryPoolBlock and OwnedMemory end up in the same assembly so // this method access modifiers need to be `protected internal` protected override bool TryGetArray(out ArraySegment <byte> arraySegment) { if (IsDisposed) { RioPipelinesThrowHelper.ThrowObjectDisposedException(nameof(RioMemoryPoolBlock)); } arraySegment = new ArraySegment <byte>(Slab.Array, _offset, _length); return(true); }
public override MemoryHandle Pin(int elementIndex = 0) { Retain(); // checks IsDisposed if (elementIndex < 0 || elementIndex > _length) { RioPipelinesThrowHelper.ThrowArgumentOutOfRangeException(_length, elementIndex); } unsafe { return(new MemoryHandle((Slab.NativePointer + _offset + elementIndex).ToPointer(), default, this));
public override MemoryHandle Pin() { if (IsDisposed) { RioPipelinesThrowHelper.ThrowObjectDisposedException(nameof(RioMemoryPoolBlock)); } Retain(); unsafe { return(new MemoryHandle(this, (Slab.NativePointer + _offset).ToPointer())); } }
public override MemoryHandle Pin(int byteOffset = 0) { Retain(); // checks IsDisposed if (byteOffset < 0 || byteOffset > _length) { RioPipelinesThrowHelper.ThrowArgumentOutOfRangeException(_length, byteOffset); } unsafe { return(new MemoryHandle(this, (Slab.NativePointer + _offset + byteOffset).ToPointer())); } }
public override OwnedMemory <byte> Rent(int size = AnySize) { if (size == AnySize) { size = _blockLength; } else if (size > _blockLength) { RioPipelinesThrowHelper.ThrowArgumentOutOfRangeException_BufferRequestTooLarge(_blockLength); } var block = Lease(); return(block); }
public override bool Release() { int newRefCount = Interlocked.Decrement(ref _referenceCount); if (newRefCount < 0) { RioPipelinesThrowHelper.ThrowInvalidOperationException(ExceptionResource.ReferenceCountZero); } if (newRefCount == 0) { OnZeroReferences(); return(false); } return(true); }