nginx的队列结构是一个双链接指针循环队列,只包含队列指针。提供的办法只对队列指针操作,不负责队列元素的分配。
一、队列定义
typedef struct ngx_queue_s ngx_queue_t;
struct ngx_queue_s {
ngx_queue_t *prev;
ngx_queue_t *next;
};
二、队列操作办法
#define ngx_queue_init(q) --初始化队列指针
#define ngx_queue_empty(h) --判断队列是否为空
#define ngx_queue_insert_head(h, x) --把队列成员x插入到h队列头部
#define ngx_queue_insert_after ngx_queue_insert_head --同上
#define ngx_queue_insert_tail(h, x) --把队列成员X插入到h队列尾部
#define ngx_queue_head(h) --获取队列h头部成员
#define ngx_queue_last(h) --获取队列h尾部成员
#define ngx_queue_sentinel(h) --返回h
#define ngx_queue_next(q) --获取队列成员q朝队尾方向下一个成员
#define ngx_queue_prev(q) --获取队列成员q朝队头方向上一个成员
#define ngx_queue_remove(x) --从队列中移除成员x
#define ngx_queue_split(h, q, n) --??
#define ngx_queue_add(h, n) --??
#define ngx_queue_data(q, type, link) --返回队列成员(type*)指针
ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue); --??
void ngx_queue_sort(ngx_queue_t *queue,
ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)); --对队列排序
三、 使用
只包含队列指针的队列使用
ngx_queue_t header; --队列头
ngx_queue_t A,B,C,D; --队列成员
初始化,让prev、next指针指向自己
ngx_queue_init(&header) ;
ngx_queue_init(&A) ;
ngx_queue_init(&B) ;
ngx_queue_init(&C) ;
ngx_queue_init(&D) ;
A1)插入A到队列头部,结构图 B1)插入A到队列尾部,结构图
ngx_queue_insert_head(&header, &A) ngx_queue_insert_tail(&header, &A)
A2)插入B到队列头部,结构图 B2)插入B到队列尾部,结构图
ngx_queue_insert_head(&header, &B) ngx_queue_insert_tail(&header, &B)
A3)插入C到队列头部,结构图 B3)插入C到队列尾部,结构图
ngx_queue_insert_head(&header, &C) ngx_queue_insert_tail(&header, &C)
A4)插入D到队列尾部,结构图 B4)插入D到队列头部,结构图
ngx_queue_insert_tail(&header, &D) ngx_queue_insert_head(&header, &D)
A5)插入A、B、C、D后 B5)插入A、B、C、D后,
--first M就是C --first M就是D
ngx_queue_t* firstM = ngx_queue_head(&header) ; ngx_queue_t* firstM = ngx_queue_head(&header) ;
--lastM就是D --lastM就是C
ngx_queue_t* lastM = ngx_queue_last(&header) ; ngx_queue_t* lastM = ngx_queue_last(&header) ;
--nextM就是A --nextM就是C
ngx_queue_t* nextM = ngx_queue_next(&B); ngx_queue_t* nextM = ngx_queue_next(&B);
--prevM就是C --prevM就是A
ngx_queue_t* prevtM = ngx_queue_prev(&B); ngx_queue_t* prevtM = ngx_queue_prev(&B);
大家看到使用ngx_queue_insert_head和ngx_queue_insert_tai不同顺序后,所谓的头部和尾部有所区别。
先ngx_queue_insert_head后ngx_queue_insert_tail,则靠近header最近元素是尾部,另一端是头部。
先ngx_queue_insert_tail后ngx_queue_insert_head,则靠近header最近元素是头部,另一端是尾部。