public long AllocateSpace(long size)
        {
            long num = -1L;

            for (int i = GetBucketIndex(size); i < m_bucketCount; i++)
            {
                if (num != -1)
                {
                    break;
                }
                SortedBucket sortedBucket = m_buckets[i];
                if (sortedBucket.Count <= 0)
                {
                    continue;
                }
                Space space = sortedBucket.Peek();
                if (space.Size >= size)
                {
                    sortedBucket.ExtractMax();
                    num           = space.Offset;
                    space.Offset += size;
                    space.Size   -= size;
                    if (space.Size > 0)
                    {
                        InsertSpace(space);
                    }
                    if (sortedBucket.Count == 0 && i != 0)
                    {
                        Array.Copy(m_buckets, i + 1, m_buckets, i, m_bucketCount - i - 1);
                        m_bucketCount--;
                    }
                }
            }
            if (num == -1 && m_allowEndAllocation)
            {
                num    = m_end;
                m_end += size;
            }
            return(num);
        }
        private void InsertSpace(Space space)
        {
            if (space.Size < m_minimumTrackedSize)
            {
                m_unuseableBytes += space.Size;
                return;
            }
            int          bucketIndex  = GetBucketIndex(space.Size);
            SortedBucket sortedBucket = m_buckets[bucketIndex];

            if (sortedBucket.Count == m_maxSpacesPerBucket)
            {
                if (m_bucketCount < m_maxBucketCount && sortedBucket.Maximum - sortedBucket.Minimum > m_bucketSplitThreshold)
                {
                    SortedBucket sortedBucket2 = sortedBucket.Split(m_maxSpacesPerBucket);
                    for (int num = m_bucketCount; num > bucketIndex + 1; num--)
                    {
                        m_buckets[num] = m_buckets[num - 1];
                    }
                    m_buckets[bucketIndex + 1] = sortedBucket2;
                    m_bucketCount++;
                    InsertSpace(space);
                }
                else if (sortedBucket.Peek().Size < space.Size)
                {
                    Space space2 = sortedBucket.ExtractMax();
                    m_unuseableBytes += space2.Size;
                    sortedBucket.Insert(space);
                }
                else
                {
                    m_unuseableBytes += space.Size;
                }
            }
            else
            {
                sortedBucket.Insert(space);
            }
        }