// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Buffers; using System.IO.MemoryMappedFiles; namespace HordeCommon { /// /// Implements an unmarshlled view of a memory mapped file /// unsafe class MemoryMappedFileView : IDisposable { sealed unsafe class MemoryWrapper : MemoryManager { private readonly byte* _pointer; private readonly int _length; public MemoryWrapper(byte* pointer, int length) { _pointer = pointer; _length = length; } /// public override Span GetSpan() => new Span(_pointer, _length); /// public override MemoryHandle Pin(int elementIndex) => new MemoryHandle(_pointer + elementIndex); /// public override void Unpin() { } /// protected override void Dispose(bool disposing) { } } readonly MemoryMappedViewAccessor _memoryMappedViewAccessor; byte* _data; /// /// Constructor /// /// public MemoryMappedFileView(MemoryMappedViewAccessor memoryMappedViewAccessor) { _memoryMappedViewAccessor = memoryMappedViewAccessor; memoryMappedViewAccessor.SafeMemoryMappedViewHandle.AcquirePointer(ref _data); } /// /// Gets a memory object for the given range /// /// /// /// public Memory GetMemory(long offset, int length) { MemoryWrapper wrapper = new MemoryWrapper(_data + offset, length); return wrapper.Memory; } /// public void Dispose() { if (_data != null) { _memoryMappedViewAccessor.SafeMemoryMappedViewHandle.ReleasePointer(); _data = null; } } } }