nginx中的队列实现就是用的双向链表这种,节点代码如下:
-
typedef struct ngx_queue_s ngx_queue_t;
-
-
struct ngx_queue_s {
-
ngx_queue_t *prev;
-
ngx_queue_t *next;
-
};
所以,nginx的队列实现其实就是常用的链表操作,具体操作如下:
-
#define ngx_queue_init(q) \
-
(q)->prev = q; \
-
(q)->next = q
-
-
-
#define ngx_queue_empty(h) \
-
(h == (h)->prev)
-
-
-
#define ngx_queue_insert_head(h, x) \
-
(x)->next = (h)->next; \
-
(x)->next->prev = x; \
-
(x)->prev = h; \
-
(h)->next = x
-
-
#define ngx_queue_insert_tail(h, x) \
-
(x)->prev = (h)->prev; \
-
(x)->prev->next = x; \
-
(x)->next = h; \
-
(h)->prev = x
-
-
-
#define ngx_queue_head(h) \
-
(h)->next
-
-
-
#define ngx_queue_last(h) \
-
(h)->prev
-
-
-
#define ngx_queue_sentinel(h) \
-
(h)
-
-
-
#define ngx_queue_next(q) \
-
(q)->next
-
-
-
#define ngx_queue_prev(q) \
-
(q)->prev
-
#define ngx_queue_data(q, type, link) \
-
<span style="white-space:pre"> span>(type *) ((unsigned char *) q - offsetof(type, link))<span style="white-space:pre">
-
span>
-
#define ngx_queue_add(h, n) \
-
(h)->prev->next = (n)->next; \
-
(n)->next->prev = (h)->prev; \
-
(h)->prev = (n)->prev; \
-
(h)->prev->next = h;
-
在使用队列之前需要初始化一下队列,这样是为了设立一个队列的哨兵节点,便于之后的操作
-
ngx_queue_init 使当前的节点成为哨兵节点,也就是自己指向自己
这里主要记录下队列获取队列数据的方法,这也是c中常用的一种技巧:
#define ngx_queue_data(q, type, link) (type *) ((unsigned char *) q - offsetof(type, link))
q为想要获取节点数据的当前节点,type是当前节点保存的数据类型 ,link是什么呢?关键点就在这,link一定要是type数据结构中的ngx_queue_t*结构的成员名,这样就可以根据成员的偏移量找到整个数据的内存指针
具体使用方式如下:
-
typedef struct {
-
ngx_queue_t qEle;
-
void* data;
-
}node_t;
-
-
ngx_queue_t* channel_queue_head;
-
ngx_queue_init(channel_queue_head);
-
node_t node;
-
ngx_queue_insert_tail(channel_queue_head, &(node.qEle));
-
-
node_t *getnode;
-
getnode = (node_t*)ngx_queue_data(&(node.qEle),node_t,qEle);
阅读(3514) | 评论(0) | 转发(0) |