Nginx源碼徹底註釋(3)ngx_list.h / ngx_list.c

列表頭文件ngx_list.h

#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; // 一個 part 至關於列表的一個節點 struct ngx_list_part_s { void *elts; // 數據存儲區 ngx_uint_t nelts; // 已存儲元素個數 ngx_list_part_t *next; //下一個 part }; // 列表定義 typedef struct { ngx_list_part_t *last; // 最後一個part的位置 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 的第一個元素的數據存儲區分配 n * size 的大小 list->part.elts = ngx_palloc(pool, n * size); if (list->part.elts == NULL) { return NGX_ERROR; } list->part.nelts = 0; // 已存元素數爲 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_ */ 

列表源文件ngx_list.c

#include <ngx_config.h> #include <ngx_core.h> ngx_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)); if (list == NULL) { return NULL; } // 鏈表表頭節點的數據存儲區 list->part.elts = ngx_palloc(pool, n * size); if (list->part.elts == NULL) { return NULL; } // 鏈表表頭節點的已存元素數爲 0 list->part.nelts = 0; list->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 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; } // 最後一個節點的已存元素數爲 0 last->nelts = 0; last->next = NULL; // 新搞出來這個節點,接到最後一個節點後邊 l->last->next = last; // 把這個新節點當成最後一個節點 l->last = last; } // 最後一個節點的數據存儲區起始位置 + 元素大小 * 最後節點的已存元素數 // 就是下一個能夠放元素的位置 elt = (char *) last->elts + l->size * last->nelts; // 最後一個節點的已存元素數加1 last->nelts++; // 返回下一個能夠放元素的位置 return elt; } 

從上面能夠看出,create 是從 pool 分配定義 list 結構的內存,分配表頭節點的內存。init 是初始化已有的 list。ui

相關文章
相關標籤/搜索