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的可用空间不足。
这时候整个缓冲区已经不足了,只能申请失败。
四种情况用文字描述不形象,一定要画图。