Skip to content

Latest commit

 

History

History
37 lines (27 loc) · 1.15 KB

ngx_queue.markdown

File metadata and controls

37 lines (27 loc) · 1.15 KB

#nginx基础数据结构之ngx_queue

个人感觉ngx的队列是非常有意思的一个数据结构。首先这个队列的结构体

struct ngx_queue_s {
    ngx_queue_t  *prev;
    ngx_queue_t  *next;
};

可以看到是由双向链表组成,但是却没有元素节点。这样的结构,跟一般的队列实现不一样,由元素自己去维护自己的队列信息。

1,初始化队列

#define ngx_queue_init(q)  \                                                   
    (q)->prev = q;         \                                                  
    (q)->next = q

2,ngx_queue_data(q, type, link),type是目标结构体,link是type结构体中的ngx_queue_s类型成员,q是当前需要获得的目标结构体中ngx_queue_s的实际内存位置,那么要获得目标结构体的位置,

(type*)((uchar*)q - offsetof(type,link))

在实际使用场景中,经常看到queue如此打扮出场

ngx_queue_insert_head(h,x)
...
q = ngx_queue_last(queue)
c = ngx_queue_data(q, type, queue);

由于元素是头部插入,作者利用LRU思想,取出最后队列尾部的元素,进行回收/移除等操作