ngx_list.{c|h}結構非常簡單,如果你看過之前的array介紹,這一節可以一帶而過:
[cpp] view plaincopyprint?
- 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;
list的操作:
[cpp] view plaincopyprint?
- //建立list
- 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)); //分配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; //實際資料數為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 = 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;
- }
[cpp] view plaincopyprint?
- //如何遍曆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] ...
-
- }
以上就介紹了nginx 源碼學習筆記(十一)——基本容器——ngx_list,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。