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的可用空間不足。
這時候整個緩衝區已經不足了,只能申請失敗。
四種情況用文字描述不形象,一定要畫圖。