ortp 队列介绍

http://blog.chinaunix.net/uid-23023613-id-151036.html

在ortp中实现了一个通用的队列,每一个队列包括三个实体,分别是队列、消息块和数据块,这三个实体分别对应queue_t、msgb和datab结构体。

queue_t的定义如下所示:

typedef struct _queue {
mblk_t _q_stopper;      /* 消息队列头 */
int q_mcount;           /*number of packet in the q */
} queue_t;
_q_stopper:消息块,内嵌于queue_t,它的主要作用是作为作为链表的表头;_q_stopper所指向的mblk_t并无实际数据,只是作为消息对列头的标识头。putq或者getq都是从_q_stopper之后的第一个mblk_t开始。
q_mcount:用于记录队列元素的个数。
注:void qinit(queue_t *q){
    mblk_init(&q->_q_stopper);
    q->_q_stopper.b_next=&q->_q_stopper;
    q->_q_stopper.b_prev=&q->_q_stopper;
    q->q_mcount=0;
}
从上面这个初始化一个queue_t的函数可以得知,_q_stopper初始化的时候,_q_stopper.b_next、_q_stopper.b_prev都是指向_q_stopper自己的。

mblk_t的定义如下所示:

typedef struct msgb {
struct msgb *b_prev;    /* 指向上一个消息块 */
struct msgb *b_next;    /* 指向下一个消息块 */
struct msgb *b_cont;    /* complex mblk_t */
struct datab *b_datap;  /* 数据块指针 */
unsigned char *b_rptr;  /* 读取的数据指针 */
unsigned char *b_wptr;  /* 写入的数据指针 */
uint32_t reserved1;
uint32_t reserved2;
} mblk_t;
b_prev和b_next:消息块的链表指针,所有消息块通过这两个指针串接成链。
b_cout:通过这个指针可以构成复合消息块,复合消息块由多个消息块组成,但在队列中作为一个元素
b_datap:消息块的数据指针,指向一个数据块
b_rptr:指向数据块的数据已经读取的部分
b_wptr:指向数据块的数据已经写入的部分
reserved1和reserved2:保留用途

datab的定义如下所示:

typedef struct datab {
unsigned char *db_base; /* 数据块的数据基址 */
unsigned char *db_lim;  /* 数据块的数据部分的结束地址 */
void (*db_freefn) (void *); /* 数据块数据的释放函数 */
int db_ref;             /* 数据块应用计数 */
} dblk_t;
db_base:数据基址
db_lim:数据的结束地址
db_freefn:用于释放数据块的数据的函数
db_ref:数据块的引用计数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值