// 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;
}
}
}
}