TAG:
在ortp中实现了一个通用的队列,每一个队列包括三个实体,分别是队列、消息块和数据块,这三个实体分别对应queue_t、msgb和datab结构体。 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的定义如下所示:
b_prev和b_next:消息块的链表指针,所有消息块通过这两个指针串接成链。
b_cout:通过这个指针可以构成复合消息块,复合消息块由多个消息块组成,但在队列中作为一个元素
b_datap:消息块的数据指针,指向一个数据块
b_rptr:指向数据块的数据已经读取的部分
b_wptr:指向数据块的数据已经写入的部分
reserved1和reserved2:保留用途
datab的定义如下所示:
db_base:数据基址
db_lim:数据的结束地址
db_freefn:用于释放数据块的数据的函数
db_ref:数据块的引用计数
|