nginx 源码学习笔记(十一)——基本容器——ngx_list

来源:互联网 发布:网络威胁别人什么罪 编辑:程序博客网 时间:2024/05/16 13:01

ngx_list.{c|h}结构非常简单,如果你看过之前的array介绍,这一节可以一带而过:

[cpp] view plaincopyprint?
  1. typedef struct ngx_list_part_s  ngx_list_part_t;  
  2. struct ngx_list_part_s {  
  3.     void             *elts;           //数据区域指针  
  4.     ngx_uint_t        nelts;           //数据实际个数  
  5.     ngx_list_part_t  *next;            //下一个数据指针  
  6. };  
  7. typedef struct {  
  8.     ngx_list_part_t  *last;  
  9.     ngx_list_part_t   part;            //数据部分  
  10.     size_t            size;           //单个数据大小  
  11.     ngx_uint_t        nalloc;         //预设的数据个数  
  12.     ngx_pool_t       *pool;           //所属的内存池  
  13. } ngx_list_t;  

list的操作:

[cpp] view plaincopyprint?
  1. //创建list  
  2. ngx_list_t *  
  3. ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)  
  4. {  
  5.     ngx_list_t  *list;  
  6.     list = ngx_palloc(pool, sizeof(ngx_list_t));           //分配list内存空间  
  7.     if (list == NULL) {  
  8.         return NULL;  
  9.     }  
  10.     list->part.elts = ngx_palloc(pool, n * size);          //分配list数据部分内存空间  
  11.     if (list->part.elts == NULL) {  
  12.         return NULL;  
  13.     }  
  14.     list->part.nelts = 0;                            //实际数据数为0  
  15.     list->part.next = NULL;                         //没有下一个节点  
  16.     list->last = &list->part;                         //最后一个就是数据本身  
  17.     list->size = size;                              //初始化每个数据的大小  
  18.     list->nalloc = n;                              //预设数据量  
  19.     list->pool = pool;                             //所属的内存池  
  20. return list;                                  //返回地址  
  21. //在这里如果你发现跟创建数组比较类似,那么说明你已经开始入门了  
  22. }  
  23. //添加数据 可以看到和添加数组基本一样,也是返回要添加数据的地址,然后进行操作  
  24. void *  
  25. ngx_list_push(ngx_list_t *l)  
  26. {  
  27.     void             *elt;  
  28.     ngx_list_part_t  *last;  
  29.     last = l->last;  
  30.     if (last->nelts == l->nalloc) {  
  31.         /* the last part is full, allocate a new list part */  
  32.         last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));  
  33.         if (last == NULL) {  
  34.             return NULL;  
  35.         }  
  36.         last->elts = ngx_palloc(l->pool, l->nalloc * l->size);  
  37.         if (last->elts == NULL) {  
  38.             return NULL;  
  39.         }  
  40.         last->nelts = 0;  
  41.         last->next = NULL;  
  42.         l->last->next = last;  
  43.         l->last = last;  
  44.     }  
  45.     elt = (char *) last->elts + l->size * last->nelts;  
  46.     last->nelts++;  
  47.     return elt;  
  48. }  

[cpp] view plaincopyprint?
  1. //如何遍历list  
  2. part = &list.part;  
  3. data = part->elts;  
  4.   
  5. for (i = 0 ;; i++) {  
  6.   
  7.     if (i >= part->nelts) {  
  8.         if (part->next == NULL) {  
  9.             break;  
  10.         }  
  11.   
  12.         part = part->next;  
  13.         data = part->elts;  
  14.         i = 0;  
  15.     }  
  16.   
  17.     ...  data[i] ...  
  18.   
  19. }  
0 0
原创粉丝点击