yaomint 发表于 2016-12-28 10:14:36

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

  ngx_list.{c|h}结构非常简单,如果你看过之前的array介绍,这一节可以一带而过:
  
typedef struct ngx_list_part_sngx_list_part_t;struct ngx_list_part_s {void             *elts;         //数据区域指针ngx_uint_t      nelts;         //数据实际个数ngx_list_part_t*next;            //下一个数据指针};typedef struct {ngx_list_part_t*last;ngx_list_part_t   part;            //数据部分size_t            size;         //单个数据大小ngx_uint_t      nalloc;         //预设的数据个数ngx_pool_t       *pool;         //所属的内存池} ngx_list_t;
  list的操作:
//创建listngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size){ngx_list_t*list;list = ngx_palloc(pool, sizeof(ngx_list_t));         //分配list内存空间if (list == NULL) {return NULL;}list->part.elts = ngx_palloc(pool, n * size);          //分配list数据部分内存空间if (list->part.elts == NULL) {return NULL;}list->part.nelts = 0;                            //实际数据数为0list->part.next = NULL;                         //没有下一个节点list->last = &list->part;                         //最后一个就是数据本身list->size = size;                              //初始化每个数据的大小list->nalloc = n;                              //预设数据量list->pool = pool;                           //所属的内存池return list;                                  //返回地址//在这里如果你发现跟创建数组比较类似,那么说明你已经开始入门了}//添加数据 可以看到和添加数组基本一样,也是返回要添加数据的地址,然后进行操作void *ngx_list_push(ngx_list_t *l){void             *elt;ngx_list_part_t*last;last = l->last;if (last->nelts == l->nalloc) {/* the last part is full, allocate a new list part */last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));if (last == NULL) {return NULL;}last->elts = ngx_palloc(l->pool, l->nalloc * l->size);if (last->elts == NULL) {return NULL;}last->nelts = 0;last->next = NULL;l->last->next = last;l->last = last;}elt = (char *) last->elts + l->size * last->nelts;last->nelts++;return elt;}
//如何遍历listpart = &list.part;data = part->elts;for (i = 0 ;; i++) {if (i >= part->nelts) {if (part->next == NULL) {break;}part = part->next;data = part->elts;i = 0;}...data ...}
页: [1]
查看完整版本: nginx 源码学习笔记(十一)——基本容器——ngx_list