队列实现文件:文件:./src/core/ngx_queue.h/.c
ngx_queue_t容器的优势在于:
实现了排序功能
它非常轻量级,是一个纯粹的双向链表,它不负责链表元素所占内存的分配,与Nginx封装的ngx_pool_t内存池完全无关
支持两个链表间的合并
1.基本数据结构
typedef struct ngx_queue_s ngx_queue_t;
struct ngx_queue_s {
ngx_queue_t *prev;
ngx_queue_t *next;
};
其中,sizeof(ngx_queue_t)=8。
从队列结构定义可以看出,nginx的队列结构里并没有其节点的数据内容。
2.基本操作
/*
* find the middle queue element if the queue has odd number of elements
* or the first element of the queue's second part otherwise
*/
ngx_queue_t *
ngx_queue_middle(ngx_queue_t *queue)
/* the stable insertion sort */
void ngx_queue_sort(ngx_queue_t *queue,
ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *))
注意 nginx 的队列操作和结构只迚行指针的操作,丌负责节点内容空间的分配和保存,所以在定义自己的队列节点的时候,需要自己定义数据结构以及分配空间, 并包含一个 ngx_queue_t 类型的成员, 需要获得原始的数据节点的时候需要使用 ngx_queue_data 宏:
#define ngx_queue_data(q, type,link)\
(type *) ((u_char *) q - offsetof(type, link))
另外,整个 queue 结构中包含一个 sentinel(哨兵) 节点, 他指向队列的头和尾。