/// <summary> /// Writes debugging marker if needed /// </summary> protected static void WriteEntryMarker(PageableStore store, BuildXLWriter writer) { if (store.Debug) { writer.Write(EntryMarker); } }
public override int Write(PageableStore store, Action <BuildXLWriter> serializer, out bool gotSealed) { lock (this) { m_stream.Seek(0, SeekOrigin.End); int start = (int)m_stream.Position; WriteEntryMarker(store, m_writer); int depth = m_writer.Depth; serializer(m_writer); Contract.Assert(depth == m_writer.Depth); m_writer.Flush(); // Make sure that whoever may pick up m_buffer concurrently will see the actual buffer contents Volatile.Write(ref m_buffer, m_stream.GetBuffer()); m_length = (int)m_stream.Length; m_capacity = m_stream.Capacity; if (m_stream.Length * 1D / m_capacity > 0.9) { Seal(); gotSealed = true; } else { // Otherwise, make it available for more writes. gotSealed = false; } return(start); } }
/// <summary> /// Read away debugging marker if needed /// </summary> protected static void ReadEntryMarker(PageableStore store, BuildXLReader reader) { if (store.Debug) { uint marker = reader.ReadUInt32(); Contract.Assume(marker == EntryMarker); } }
public MemoryPageStream(PageableStore store) { Contract.RequiresNotNull(store); Contract.Requires(store.CanWrite); Contract.Assume( store.m_initialBufferSize > 0, "Initial buffer size for store was 0. This implies an attempt to write to a non-writable store."); m_stream = new MemoryStream(store.m_initialBufferSize); m_writer = store.CreateWriter(m_stream, leaveOpen: true); m_buffer = m_stream.GetBuffer(); }
public override T Read <T>(PageableStore store, int offset, Func <BuildXLReader, T> deserializer) { var buffer = GetBuffer(); using (var stream = new MemoryStream(buffer, writable: false, index: offset, count: buffer.Length - offset)) using (var reader = store.CreateReader(stream, leaveOpen: true)) { ReadEntryMarker(store, reader); T value = deserializer(reader); Contract.Assume(reader.Depth == 0); return(value); } }
/// <summary> /// Writes an item. /// </summary> public virtual int Write(PageableStore store, Action <BuildXLWriter> serializer, out bool gotSealed) { Contract.Requires(CanWrite); gotSealed = false; return(0); }
/// <summary> /// Reads an item. /// </summary> public abstract T Read <T>(PageableStore store, int offset, Func <BuildXLReader, T> deserializer);