ngx_list.{c|h}結構非常簡單,如果你看過之前的array介紹,這一節可以一帶而過:
[cpp] view
plaincopyprint?
- typedef struct ngx_list_part_s ngx_list_part_s _s {
-
void
-
ngx_uint_t nelts; ngx_list_part_t *next; //下一個資料指標 struct {
-
ngx_list_part_t *last; 🎠 //資料部分
-
size //單一資料大小
-
- ngx_uint_t nalloc; /預設_t *pool; //所屬的記憶體池 list的操作:
[cpp] view
plaincopyprint?
- //建立list
- ngx_list_t *
- ize_t size)
{ ngx_list_t *list; list = ngx_palloc(pool, - sizeof(ngx_list_t)); if (list == NULL) {
- return NULL;
-
} //分配list資料部分記憶體空間
-
- if (list->part.elts == 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; -
//在這裡如果你發現跟建立陣列比較類似,那麼表示你已經開始入門了
- }
- //新增資料 可以看到和新增陣列基本上一樣,也是回傳要新增資料的位址,然後運作
-
* _list_push(ngx_list_t * l)
-
{
-
void- ngx_list_part_t *last; last = l->last;
- nelts == l->nalloc) {
-
/* the last part
- last = ngx_palloc(l->pool, sizeof (ngx_list_part_t));
- if (last == return
NULL; - } ->pool, l->nalloc * l->size);
- if return NULL;
- return NULL;
} last->nelts = 0; l->last->next = last; - l->last = last; }
- elt = (char *) last->nelts++;
- return elt;
}
[cpp] view
plaincopyprint?
- //如何遍歷list
- part = &list.part;
-
for
- (i = 0 ;; i++) {
-
if
if
(part->next == NULL) {
- break;
} part = part->next; data = part->elts; - i = 0;
} - ...
以上就介紹了nginx 原始碼學習筆記(十一)——基本容器——ngx_list,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。