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的可用空间不足。

这时候整个缓冲区已经不足了,只能申请失败。

四种情况用文字描述不形象,一定要画图。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值