// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Buffers; using System.Collections.Generic; using System.IO; using System.IO.MemoryMappedFiles; using System.Text; 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) { this.Pointer = Pointer; this.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) { } } MemoryMappedViewAccessor MemoryMappedViewAccessor; byte* Data; /// /// Constructor /// /// public MemoryMappedFileView(MemoryMappedViewAccessor MemoryMappedViewAccessor) { this.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; } } } }