public AccessRangeUncached ( long offset, uint size, MemoryMappedFileAccess access = MemoryMappedFileAccess.ReadWrite ) : |
||
offset | long | The offset within the stream, relative to the end of the stream header. |
size | uint | The size of the range to access, in bytes. |
access | MemoryMappedFileAccess | |
return |
public StreamRange AccessRangeUncached(long offset, uint size, MemoryMappedFileAccess access = MemoryMappedFileAccess.ReadWrite)
{
unchecked {
long relativeOffset = offset + HeaderSize;
EnsureCapacity(relativeOffset + size);
long actualOffset;
uint actualSize;
var view = Cache.CreateViewUncached(relativeOffset, size, access, out actualOffset, out actualSize);
return new StreamRange(
this, view, relativeOffset, size, actualOffset, actualSize
);
}
}
private void EnsureFreelistExists() { var pHeader = (BTreeHeader *)_HeaderRange.Pointer; if (EnableFreelist) { long oldOffset = 0; if (pHeader->FreelistIndexOffset == 0) { uint size = FreelistIndex.Size; long?offset = AllocateDataSpace(ref size); if (!offset.HasValue) { throw new OutOfMemoryException("Unable to allocate space for freelist index in data stream."); } oldOffset = Interlocked.Exchange(ref pHeader->FreelistIndexOffset, offset.Value); } _FreelistIndexRange = DataStream.AccessRangeUncached(pHeader->FreelistIndexOffset, FreelistIndex.Size, MemoryMappedFileAccess.ReadWrite); Native.memset(_FreelistIndexRange.Pointer, 0, new UIntPtr(FreelistIndex.Size / 4)); if (oldOffset != 0) { FreelistPut(oldOffset, FreelistIndex.Size); } } else { pHeader->FreelistIndexOffset = 0; } }