示例#1
0
        /// <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));
        }
示例#2
0
        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,
            });
        }