text: 
  /*
   * Copyright (C) Igor Sysoev
   * Copyright (C) Nginx, Inc.
   */
  
  
  #ifndef _NGX_LIST_H_INCLUDED_
  #define _NGX_LIST_H_INCLUDED_
  
  
  #include <ngx_config.h>
  #include <ngx_core.h>
  
  
  typedef struct ngx_list_part_s  ngx_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;
  
  
  ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size);   // 创建父结点
  
  static ngx_inline ngx_int_t
  ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)
  {
      list->part.elts = ngx_palloc(pool, n * size);   // 分配在small还是large链表上取决于n*size
      if (list->part.elts == NULL) {
          return NGX_ERROR;
      }
  
      list->part.nelts = 0;       //  指向最后一个使用过的元素
      list->part.next = NULL;     // 指向链表的下一个结点
      list->last = &list->part;   // 指向当前链表的最后一个结点，便于尾插
      list->size = size;          // 元素的大小(占用内存的字节)
      list->nalloc = n;           // 元素个数
      list->pool = pool;          // 指向内存池
  
      return NGX_OK;
  }
  
  
  /*
   *
   *  the iteration through the list:
   *
   *  part = &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[i] ...
   *
   *  }
   */
  
  
  void *ngx_list_push(ngx_list_t *list);
  
  
  #endif /* _NGX_LIST_H_INCLUDED_ */
  