Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2320976
  • 博文数量: 252
  • 博客积分: 5472
  • 博客等级: 大校
  • 技术积分: 3107
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-17 18:39
文章分类

全部博文(252)

文章存档

2012年(96)

2011年(156)

分类: LINUX

2012-03-15 15:02:06

ngx_queue

ngx_queue.{c,h} 实现了一个队列的操作逻辑,队列的基本结构为一个双向队列

基础的数据结构为

  1. typedef struct ngx_queue_s ngx_queue_t;

  2. struct ngx_queue_s {
  3.     ngx_queue_t *prev;
  4.     ngx_queue_t *next;
  5. };

注 意nginx的队列操作和结构只进行指针的操作,不负责节点内容空间的分配和保存,所以在定义自己的队列节点的时候,需要自己定义数据结构以及分配空间, 并包含一个ngx_queue_t类型的成员, 需要获得原始的数据节点的时候需要使用ngx_queue_data宏

  1. #define ngx_queue_data(q, type, link) \
  2.     (type *) ((u_char *) q - offsetof(type, link))

另外,整个queue结构中包含一个 sentinel(哨兵) 节点, 他指向队列的头和尾

下面是一个queue操作的例子


  1. #include <stdio.h>
  2. #include "ngx_config.h"
  3. #include "ngx_conf_file.h"
  4. #include "nginx.h"
  5. #include "ngx_core.h"
  6. #include "ngx_string.h"
  7. #include "ngx_palloc.h"
  8. #include "ngx_queue.h"

  9. volatile ngx_cycle_t *ngx_cycle;
  10. void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, const char *fmt, ...) { }

  11. // 用雅虎的成员列表作为一个简单的例子
  12. typedef struct yahoo_s {
  13.     ngx_queue_t queue;
  14. } yahoo_t;

  15. typedef struct yahoo_guy_s {
  16.     ngx_uint_t id;
  17.     u_char* name;
  18.     ngx_queue_t queue;
  19. } yahoo_guy_t;

  20. // 排序使用的比较函数, 按照id的大小排序,id大放到到前面
  21. ngx_int_t yahoo_no_cmp(const ngx_queue_t* p, const ngx_queue_t* n)
  22. {
  23.     yahoo_guy_t *pre, *next;
  24.     pre = (yahoo_guy_t*) ngx_queue_data(p, yahoo_guy_t, queue);
  25.     next = (yahoo_guy_t*) ngx_queue_data(n, yahoo_guy_t, queue);
  26.     return ((pre->id > next->id) ? 1:0);
  27. }

  28. int main()
  29. {
  30.     ngx_pool_t* pool;
  31.     yahoo_guy_t* guy;
  32.     ngx_queue_t* q;
  33.     yahoo_t* yahoo;
  34.     pool = ngx_create_pool(1024*10, NULL); //初始化内存池
  35.     int i;
  36.     // 构建队列
  37.     const ngx_str_t names[] = {
  38.         ngx_string("rainx"), ngx_string("xiaozhe"), ngx_string("zhoujian")
  39.     } ;
  40.     const int ids[] = {4611, 8322, 6111};

  41.     yahoo = ngx_palloc(pool, sizeof(yahoo_t));
  42.     ngx_queue_init(&yahoo->queue); //初始化queue

  43.     for(i = 0; i < 3; i++)
  44.     {
  45.       guy = (yahoo_guy_t*) ngx_palloc(pool, sizeof(yahoo_guy_t));
  46.       guy->id = ids[i];
  47.       //guy->name = (char*) ngx_palloc(pool, (size_t) (strlen(names[i]) + 1) );
  48.       guy->name = (u_char*) ngx_pstrdup(pool, (ngx_str_t*) &(names[i]) );

  49.       ngx_queue_init(&guy->queue);
  50.       // 从头部进入队列
  51.       ngx_queue_insert_head(&yahoo->queue, &guy->queue);
  52.     }

  53.     // 从尾部遍历输出
  54.     for(q = ngx_queue_last(&yahoo->queue);
  55.         q != ngx_queue_sentinel(&yahoo->queue);
  56.         q = ngx_queue_prev(q) ) {

  57.         guy = ngx_queue_data(q, yahoo_guy_t, queue);
  58.         printf("No. %d guy in yahoo is %s \n", guy->id, guy->name);
  59.     }

  60.     // 排序从头部输出
  61.     ngx_queue_sort(&yahoo->queue, yahoo_no_cmp);
  62.     printf("sorting....\n");
  63.     for(q = ngx_queue_prev(&yahoo->queue);
  64.         q != ngx_queue_sentinel(&yahoo->queue);
  65.         q = ngx_queue_last(q) ) {

  66.         guy = ngx_queue_data(q, yahoo_guy_t, queue);
  67.         printf("No. %d guy in yahoo is %s \n", guy->id, guy->name);
  68.     }

  69.     ngx_destroy_pool(pool);
  70.     return 0;
  71. }

编译运行
按照以前的运行array的方法

运行结果为

  1. No. 4611 guy in yahoo is rainx
  2. No. 8322 guy in yahoo is xiaozhe
  3. No. 6111 guy in yahoo is zhoujian
  4. sorting....
  5. No. 8322 guy in yahoo is xiaozhe
  6. No. 6111 guy in yahoo is zhoujian
  7. No. 4611 guy in yahoo is rainx


阅读(1869) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~