加入收藏 | 设为首页 | 会员中心 | 我要投稿 江门站长网 (https://www.0750zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Nginx 中 ngx_queue中的一点认识

发布时间:2021-11-25 20:41:44 所属栏目:教程 来源:互联网
导读: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;

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 的首地址.
 
 

(编辑:江门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读