/// <summary> /// Invokes a serializer to store some data. /// </summary> /// <returns>Unique id for stored value.</returns> public PageableStoreId Write(Action <BuildXLWriter> serializer) { Contract.RequiresNotNull(serializer); PageStreamBase writablePageStream; if (!m_availableWritablePageStreams.TryPop(out writablePageStream)) { writablePageStream = new MemoryPageStream(this); Contract.Assert(writablePageStream.CanWrite); lock (m_pageStreams) { m_pageStreams.Add(writablePageStream); } } Contract.AssertNotNull(writablePageStream); var idValue = (uint)Interlocked.Increment(ref m_lastId); Contract.Assume(idValue > 0); bool gotSealed; int offset = writablePageStream.Write(this, serializer, out gotSealed); m_itemLocations[idValue] = new ItemLocation(writablePageStream, offset); if (!gotSealed) { m_availableWritablePageStreams.Push(writablePageStream); } return(new PageableStoreId(idValue)); }
protected static SerializedState ReadSerializedState(BuildXLReader reader) { Contract.RequiresNotNull(reader); bool debug = reader.ReadBoolean(); int streamCount = reader.ReadInt32(); int[] pageStreamLengths = new int[streamCount]; for (int i = 0; i < streamCount; i++) { pageStreamLengths[i] = reader.ReadInt32(); } List <PageStreamBase> streams = new List <PageStreamBase>(streamCount); for (int i = 0; i < streamCount; i++) { streams.Add(MemoryPageStream.Deserialize(reader, pageStreamLengths[i])); } Contract.Assert(streams.Count == streamCount); int lastId = reader.ReadInt32(); ConcurrentDenseIndex <ItemLocation> offsets = new ConcurrentDenseIndex <ItemLocation>(debug); for (uint i = 0; i < lastId; i++) { PageableStoreId id = new PageableStoreId(i + 1); var streamIdentifier = reader.ReadInt32(); var offset = reader.ReadInt32(); offsets[id.Value] = new ItemLocation(streams[streamIdentifier], offset); } return(new SerializedState() { Debug = debug, PageStreams = streams, ItemLocations = offsets, LastId = lastId, }); }