// 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); }