这里了解一下libevent中使用的队列 TAILQ
参考博客: http://blog.csdn.net/luotuo44/article/details/38374009
以下是队列使用的两个结构体:头节点和节点
//虽然官方给了注释,但是之前看的时候愣是没看懂,看了他人博客才清楚
//节点中的tgh_last并不是指最后一个节点,而是指最后一个节点的next元素地址
//还要注意的是tgh_last是二级指针
#define TAILQ_HEAD(name,type) \
struct name { \
structtype *tqh_first; /* first element */ \
structtype **tqh_last; /* addr of last nextelement */ \
}
//关于节点中的tge_prev,并不是指前一个节点,不是与next相对的
//tge_prev指的是前一个节点的next元素地址
#define TAILQ_ENTRY(type) \
struct { \
structtype *tqe_next; /* next element */ \
structtype **tqe_prev; /* address of previousnext element */ \
}
可以看出来的是,下面是匿名结构体
该类型结构体一般是作为另一个结构体或是联合体的成员出现
队列的具体结构看这两个结构体虽然能看出些端倪,但不如让我们深入观察,看清这个结构体是如何操作的
所以接下来对几个关键/难懂的操作进行一一解释
首先,让我们看看插入操作的源代码:
#define TAILQ_INSERT_TAIL(head, elm, field) do{ \
(elm)->field.tqe_next = NULL; \
(elm)->field.tqe_prev = (head)->tqh_last; \
*(head)->tqh_last = (elm);