pjlib系列之數據結構fifobuf

fifobuf是個先進先出的隊列,使用結構體pj_fifobuf_t表示。該結構體四個指針,其中first和last表示緩衝區的起始和結束,這兩個指針初始化一次就不再改變,ubegin和uend指向數據的開始和結束,入隊列時,uend後移,出隊列時,ubegin後移,當uend後移到和ubegin相等時,緩衝區被填滿了、full標誌設1,直到有數據出隊列時,才重新設0。

struct pj_fifobuf_t
{
    char *first, *last;
    char *ubegin, *uend;
    int full;
};

應用需要先申請一塊內存,然後調用pj_fifobuf_init,填充pj_fifobuf_t,讓其指針指向這塊內存。

每一個入隊列的數據爲size,但緩衝區要佔用size+unsign個字節,因爲開始的unsign記錄這個數據包的大小。

如隊列時,有4種情況:

1、begin指針在前,end指針在後,並且end到last的可用空間足夠。

這種是最一般情況,直接入隊列就行,end指針後移。

2、begin指針在前,end指針在後,但是end到last的可用空間不足。

由於到尾部空間不足,有兩種策略,一是先填充完剩餘空間,剩下的再從頭開始;另一種是放棄剩下的不足空間,直接從頭開始。pjlib的fifobuf採用第二種。

3、end指針在前,begin指針在後,此時新進隊列已經到達尾部last,重頭first開始了,並且end到last的可用空間足夠。

這時候雖然從頭開始了,但是空間足夠,直接申請即可,不過這時候的可用空間長度是begin-end,而不是last-end。

4、end指針在前,begin指針在後,此時新進隊列已經到達尾部last,重頭first開始了,但是end到last的可用空間不足。

這時候整個緩衝區已經不足了,只能申請失敗。

四種情況用文字描述不形象,一定要畫圖。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章