DSNetwork/Receiver 緩衝池實現機制分析

來源:互聯網
上載者:User

在CBufferPool中有如下代碼:

 

 for (i = 0; i < dwPoolSize; i++) 
{
        pBuffer = new CBuffer (
                        this,
                        m_dwBufferAllocatedLength,
                        phr
                        );

            省略錯誤檢查代碼......
       pBuffer -> InsertHead (& m_Buffers);
    }

為緩衝池分配dwPoolSize 個緩衝區 即產生dwPoolSize個CBuffer 對象指標 當然 同時產生dwPoolSize個 CBuffer ::m_ListEntry

pBuffer是CBuffer類型 
這裡調用
void InsertHead (IN LIST_ENTRY * pListHead) { ASSERT (IsListEmpty (& m_ListEntry)) ; InsertHeadList (pListHead, & m_ListEntry) ; }

pBuffer -> InsertHead (& m_Buffers);【就是把新得到的 CBuffer中的m_ListEntry依次 插入到 CBufferPool成員變數m_Buffers前面從而構成一個包含dwPoolSize+1個元素的 雙向鏈表。

當需要去的緩衝區時 調用CBuffer *CBufferPool::GetBuffer

代碼如下:

{

CBuffer *       pBuffer ;

........
 pListEntry = m_Buffers.Flink;
        pBuffer = CBuffer::RecoverCBuffer (pListEntry);
//內部用 CONTAINING_RECORD 獲得 pListEntry所在的CBuffer 對象

...........

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.