Example #1
0
        private TMemNode Allocate(int Size)
        {
            TMemNode Node, Temp;
            int      Pad;

            // サイズ制限
            if (Size < TMemNode.GetMinimumSize())
            {
                Size = TMemNode.GetMinimumSize();
            }

            Size += TMemNode.GetHeaderSize() + TMemNode.GetFooterSize();

            // アライメント調整
            Pad = Size & 0x3;
            if (Pad != 0)
            {
                Size += 4 - Pad;
            }

            // 取得サイズが空き領域に対してある程度小さい場合
            if (Size < m_cmpl.mplsz / 8)
            {
                // 空き領域リストの先頭から検索
                Temp = m_FreeMem.First;
                while (Temp != null)
                {
                    Node = Temp;
                    Temp = Node.Next;

                    // 取得サイズより大きい空き領域の場合
                    if (Size < Node.Size)
                    {
                        // 空き領域からメモリ取得
                        return(Allocate(Node, Size));
                    }
                    // 取得サイズと等しい空き領域の場合
                    else if (Size == Node.Size)
                    {
                        m_FreeMem.Remove(Node);
                        return(new TMemNode(Node, Size));
                    }
                }
            }
            // 大きい場合
            else
            {
                // 空き領域リストの末尾から検索
                Temp = m_FreeMem.Last;
                while (Temp != null)
                {
                    Node = Temp;
                    Temp = Node.Previous;

                    // 取得サイズより大きい空き領域の場合
                    if (Size < Node.Size)
                    {
                        // 空き領域からメモリ取得
                        return(Allocate(Node, Size));
                    }
                    // 取得サイズと等しい空き領域の場合
                    else if (Size == Node.Size)
                    {
                        m_FreeMem.Remove(Node);
                        return(new TMemNode(Node, Size));
                    }
                }
            }
#if DEBUG
            if (!m_Dumped)
            {
                m_Nucleus.EnumMemoryBlock(this);
                m_Dumped = true;
            }
#endif
            return(null);
        }