nginx源码分析—队列结构ngx_queue_t

队列实现文件:文件:./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(哨兵) 节点, 他指向队列的头和尾。


你可能感兴趣的:(nginx源码分析—队列结构ngx_queue_t)