internal VirtualView(VirtualViewContainer accessor, long view_offset, long offset, long capacity) { m_viewoffset = view_offset; m_viewaccessor = accessor; m_offset = offset; m_capacity = capacity; }
/// <summary> /// Create a VirtualView /// </summary> /// <param name="offset">absolute offset</param> /// <param name="length">length of virtual view</param> /// <returns>VirtualView instance</returns> public VirtualView CreateView(long offset, long length) { var range = new Range <Int64> { Minimum = offset, Maximum = offset + length }; //look for views in that size var view = GetViewByRange(range); if (view != null) { Statistics.NumberOfViewReuse++; //if found, create MappedViewContainer var mappedViewContainer = new VirtualViewContainer { Container = view, Range = range }; mappedViewContainer.MappedView = new VirtualView(mappedViewContainer, view.Range.Minimum, offset, length); view.MappedViews.Add(mappedViewContainer); //ClearUnusedMappings(); return(mappedViewContainer.MappedView); } //if not found, create view, create MappedViewContainer var maximized = GetMaximizedRange(offset, length); var container = new MemoryMappedViewContainer(); container.Range = maximized; container.MemoryMapper = this; //container.View = m_mmf.CreateViewAccessor(maximized.Minimum, maximized.Maximum - maximized.Minimum, MemoryMappedFileAccess.ReadWrite); m_views.Add(container); Statistics.NumberOfViewCreates++; //recursively get view (no reason to implement logic twice, only for optimizations) return(CreateView(offset, length)); }
public void Dispose() { //m_viewaccessor.Container.View.Flush(); m_viewaccessor.Container.MappedViews.Remove(m_viewaccessor); m_viewaccessor = null; }