예제 #1
0
 internal VirtualStream(VirtualStreamContainer stream, long stream_offset, long offset, long length)
 {
     m_stream = stream;
     m_offset = offset;
     m_length = length;
     m_stream_offset = stream_offset;
     m_stream.Container.Stream.Position = m_offset - m_stream_offset;
 }
예제 #2
0
 public new void Dispose()
 {
     //remove this stream from its container.
     m_stream.Container.MappedStreams.Remove(m_stream);
     m_stream = null;
 }
예제 #3
0
        /// <summary>
        /// Create a VirtualStream
        /// </summary>
        /// <param name="offset">absolute offset</param>
        /// <param name="length">length of virtual stream</param>
        /// <returns>VirtualStream instance</returns>
        public VirtualStream CreateStream(long offset, long length)
        {
            var range = new Range<Int64> { Minimum = offset, Maximum = offset + length };
            //look for views in that size
            var stream = GetStreamByRange(range);
            if (stream != null)
            {
                Statistics.NumberOfStreamReuse++;

                //if found, create MappedViewContainer
                var mappedStreamContainer = new VirtualStreamContainer { Container = stream, Range = range };
                mappedStreamContainer.MappedStream = new VirtualStream(mappedStreamContainer,stream.Range.Minimum, offset, length);
                stream.MappedStreams.Add(mappedStreamContainer);

                //ClearUnusedMappings();

                return mappedStreamContainer.MappedStream;
            }

            //if not found, create view, create MappedViewContainer
            var maximized = GetMaximizedRange(offset, length);
            var container = new MemoryMappedStreamContainer();
            container.Range = maximized;
            container.MemoryMapper = this;
            //container.Stream = m_mmf.CreateViewStream(maximized.Minimum, maximized.Maximum - maximized.Minimum, MemoryMappedFileAccess.ReadWrite);
            m_streams.Add(container);

            Statistics.NumberOfStreamCreates++;

            //recursively get view (no reason to implement logic twice, only for optimizations)
            return CreateStream(offset, length);
        }