Ejemplo n.º 1
0
        // TODO: Test if adding padding helps under contention
        //private long pad0, pad1, pad2, pad3, pad4, pad5, pad6, pad7;

        internal PoolChunk(PoolArena <T> arena, T memory, int pageSize, int maxOrder, int pageShifts, int chunkSize, int offset, IntPtr pointer)
        {
            if (maxOrder >= 30)
            {
                ThrowHelper.ThrowArgumentException_CheckMaxOrder30(maxOrder);
            }

            Unpooled             = false;
            Arena                = arena;
            Memory               = memory;
            _pageSize            = pageSize;
            _pageShifts          = pageShifts;
            _maxOrder            = maxOrder;
            _chunkSize           = chunkSize;
            Offset               = offset;
            NativePointer        = pointer;
            _unusable            = (sbyte)(maxOrder + 1);
            _log2ChunkSize       = Log2(chunkSize);
            _subpageOverflowMask = ~(pageSize - 1);
            _freeBytes           = chunkSize;

            Debug.Assert(maxOrder < 30, "maxOrder should be < 30, but is: " + maxOrder);
            _maxSubpageAllocs = 1 << maxOrder;

            // Generate the memory map.
            _memoryMap = new sbyte[_maxSubpageAllocs << 1];
            _depthMap  = new sbyte[_memoryMap.Length];
            int memoryMapIndex = 1;

            for (int d = 0; d <= maxOrder; ++d)
            {
                // move down the tree one level at a time
                int depth = 1 << d;
                for (int p = 0; p < depth; ++p)
                {
                    // in each level traverse left to right and set value to the depth of subtree
                    _memoryMap[memoryMapIndex] = (sbyte)d;
                    _depthMap[memoryMapIndex]  = (sbyte)d;
                    memoryMapIndex++;
                }
            }

            _subpages = NewSubpageArray(_maxSubpageAllocs);
        }