/// <summary>
 /// Begin reading data at the iteration index.
 /// </summary>
 /// <param name="foreachIndex"></param>
 /// <remarks>BeginForEachIndex must always be called balanced by a EndForEachIndex.</remarks>
 public void BeginForEachIndex(int foreachIndex)
 {
     this.MForeachIndex    = foreachIndex;
     this._mElementCount   = 0;
     this._mNumberOfBlocks = 0;
     this._mFirstBlock     = this._mCurrentBlock;
     this._mFirstOffset    = (int)(this._mCurrentPtr - (byte *)this._mCurrentBlock);
 }
 internal Reader(ref UnsafeEventStream stream)
 {
     this.MBlockStream        = stream._blockData;
     this.MCurrentBlock       = null;
     this.MCurrentPtr         = null;
     this.MCurrentBlockEnd    = null;
     this.MRemainingItemCount = 0;
     this.MLastBlockSize      = 0;
 }
            /// <summary>
            /// Begin reading data at the iteration index.
            /// </summary>
            /// <param name="foreachIndex"></param>
            /// <remarks>BeginForEachIndex must always be called balanced by a EndForEachIndex.</remarks>
            /// <returns>The number of elements at this index.</returns>
            public int BeginForEachIndex(int foreachIndex)
            {
                this.MRemainingItemCount = MBlockStream->Ranges[foreachIndex].ElementCount;
                this.MLastBlockSize      = MBlockStream->Ranges[foreachIndex].LastOffset;

                this.MCurrentBlock    = MBlockStream->Ranges[foreachIndex].Block;
                this.MCurrentPtr      = (byte *)this.MCurrentBlock + MBlockStream->Ranges[foreachIndex].OffsetInFirstBlock;
                this.MCurrentBlockEnd = (byte *)this.MCurrentBlock + UnsafeEventStreamBlockData.AllocationSize;

                return(this.MRemainingItemCount);
            }
 internal IndexWriter(ref UnsafeEventStream stream)
 {
     this.MBlockStream      = stream._blockData;
     this.MForeachIndex     = int.MinValue;
     this._mElementCount    = -1;
     this._mCurrentBlock    = null;
     this._mCurrentBlockEnd = null;
     this._mCurrentPtr      = null;
     this._mFirstBlock      = null;
     this._mNumberOfBlocks  = 0;
     this._mFirstOffset     = 0;
     this._mThreadIndex     = 0;
 }
            /// <summary>
            /// Returns pointer to data.
            /// </summary>
            /// <param name="size">Size in bytes.</param>
            /// <returns>Pointer to data.</returns>
            public byte *ReadUnsafePtr(int size)
            {
                this.MRemainingItemCount--;

                byte *ptr = this.MCurrentPtr;

                this.MCurrentPtr += size;

                if (this.MCurrentPtr > this.MCurrentBlockEnd)
                {
                    this.MCurrentBlock = MCurrentBlock->Next;
                    this.MCurrentPtr   = MCurrentBlock->Data;

                    this.MCurrentBlockEnd = (byte *)this.MCurrentBlock + UnsafeEventStreamBlockData.AllocationSize;

                    ptr = this.MCurrentPtr;
                    this.MCurrentPtr += size;
                }

                return(ptr);
            }
        internal UnsafeEventStreamBlock *Allocate(UnsafeEventStreamBlock *oldBlock, int threadIndex)
        {
            Assert.IsTrue(threadIndex < this.BlockCount && threadIndex >= 0);

            var block = (UnsafeEventStreamBlock *)UnsafeUtility.Malloc(AllocationSize, 16, this.Allocator);

            block->Next = null;

            if (oldBlock == null)
            {
                // Append our new block in front of the previous head.
                block->Next = this.Blocks[threadIndex];
                this.Blocks[threadIndex] = block;
            }
            else
            {
                oldBlock->Next = block;
            }

            return(block);
        }
示例#7
0
        private void Deallocate()
        {
            if (this._blockData == null)
            {
                return;
            }

            for (int i = 0; i != _blockData->BlockCount; i++)
            {
                var block = this._blockData->Blocks[i];
                while (block != null)
                {
                    UnsafeEventStreamBlock *next = block->Next;
                    UnsafeUtility.Free(block, this._allocator);
                    block = next;
                }
            }

            UnsafeUtility.Free(this._blockData->Ranges, this._allocator);
            UnsafeUtility.Free(this._blockData->ThreadRanges, this._allocator);
            UnsafeUtility.Free(this._blockData, this._allocator);
            this._blockData = null;
            this._allocator = Allocator.None;
        }