Nginx 中 ngx_queue中的一点理解

2014-11-24 09:17:33 · 作者: · 浏览: 1

ngx_queue的定义


typedef struct ngx_queue_s ngx_queue_t;


struct ngx_queue_s {


ngx_queue_t *prev;


ngx_queue_t *next;


};



在Wiki的"Nginx代码研究"中看到ngx_queue 的如下用法,刚开始颇有点不解,


typedef struct yahoo_s {


ngx_queue_t queue;


} yahoo_t;



typedef struct yahoo_guy_s {


ngx_unit_t id;


u_char* name;


ngx_queue_t queue;


} yahoo_guy_t;


......


yahoo_guy_t* guy;


ngx_queue_t* q;


yahoo_t* yahoo;


......



ngx_queue_init(&guy->queue);


ngx_queue_insert_head(&yahoo->queue, &guy->queue);


......


guy = ngx_queue_data(q, yahoo_guy_t, queue);


......


我疑惑的是,为什么插入队列中的是 &guy->queue, 而出来的却是 guy 呢


首先, 看ngx_queue_data()的定义:


#define ngx_queue_data(q, type, link) /


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



而宏offsetof的定义为:


#define offsetof(s, m) (size_t)&(((s *)0)->m)


至此清楚, 原来进入yahoo->queue中的只是 guy->queue的地址值, guy的实际内容在pool中,通过offsetof宏取得&guy->queue的在相应guy的偏移值, 再用guy->queue的地址减去偏移值即为guy 的首地址.