(1)定义:TAILQ_ENTRY(type) 初始化一个type类型的entry 03 Librdkafka的基础数据结构 1 --- 队列 两个元素: tqh_first: 指向队列的第一个成员; tqh_last: 存的是队列里的最后一个元素的 next指针的变量地址, 这个二级指针太有用了,我们后边会再讲到; ...
TAILQ是linux内核对双向队列操作的一种抽象,能实现操作队列需要的各种操作:插入元素,删除元素,遍历队列等,其封装是对应的宏定义,下面详细说明tailq的操作,从定义,初始化,插入,删除和遍历这几个API来介绍,并且提供c++版本的tailq。 tailq的宏定义API (1)定义:TAILQ_ENTRY(type) 初始化一个type类型的entry 代码语言:...
首先看一下这个TAILQ链表的结构,TAILQ链表包括两个部分,一个叫HEAD的头部,另外一个就是ENTRY实体部分;下面是两部分的定义: #define TAILQ_HEAD(name, type) \ struct name { \ struct type *tqh_first; /* first element */ \ struct type **tqh_last; /* addr of last next element */ \ TRACEBUF...
for (pos = list_first_entry(head, typeof(*pos), member); \ &pos->member != (head); \ pos = list_next_entry(pos, member)) #define list_for_each_entry_reverse(pos, head, member) \ for (pos = list_last_entry(head, typeof(*pos), member); \ &pos->member != (head); \ ...
定义一个结构体,它只是尾队列的一个元素 它必须包含一个TAILQ_ENTRY来指向上一个和下一个元素 */ struct tailq_entry int value; TAILQ_ENTRY(tailq_entry) entries; ; //定义队列的头部 TAILQ_HEAD(, tailq_entry) my_tailq_head; int main(int argc, char *argv) ...
QUEUE_ITEM 是我们定义的存放在队列里的东东,简单起见只包括一个int值 TAILQ_ENTRY(QUEUE_ITEM) entries 主要是存放下一个对象和前一个对象的指针,具体见 header 根据头文件进行宏替换后,实际我们声明的是这样的结构: struct QUEUE_ITEM{ int value;
这里要注意,TAILQ_ENTRY与TAILQ_HEAD的内存布局是一样的,为什么TAILQ_LAST和TAILQ_PREV中不将(head)->tqh_last)转换为TAILQ_HEAD而不是转换为TAILQ_ENTRY是因为TAILQ_ENTRY这个结构体是直接定义在你用户定义的结构体中,无法获取他的类型来进行转换。 其他的宏都比较简单,直来直去,比较好理解,这里...
其中,var是指向每个元素的指针,head是尾列队的指针,field是尾列队结构体中指向下一个元素的指针的名称。使用该宏可以遍历整个尾列队,对于尾列队中的每个元素,宏会将var指针指向该元素,并执行后续的代码。示例代码如下: ```c struct element { int value; TAILQ_ENTRY(element) entries; }; TAILQ_HEAD(tailq, ...
为TAILQ_ENTRY是因为TAILQ_ENTRY这个结构体是直接定义在你用户定义的结构体中,无法获取他的类型来进行转换。 可以尝试着分析一下这个宏:宏的目的是查找某一个节点的前一个节点:首先找到这个节点的...libevent中的例子中使用的是FreeBSD下的queue.h,在linux的/usr/include/sys/queue.h也有该头文件,下tailqueue的...