ngx_list_t是nginx封裝的鍊錶容器,使用的很頻繁。它有兩個結構體,ngx_list_t描述的是整個鍊錶,而ngx_list_part_t只描述鍊錶的乙個元素。為了方便理解,我們可以將它稱為陣列的鍊錶。也就是是說,ngx_list_t是乙個鍊錶容器,而鍊錶中的元素又是乙個陣列。事實上,ngx_list_part_t陣列中的元素才是使用者需要儲存的東西。
這樣的結構表達方式有什麼樣的好處:
(1)鍊錶中儲存的元素是靈活的,它可以是任何一種資料結構;
(2)鍊錶元素需要占用的記憶體由ngx_list_t管理,它已經通過陣列分配好了;
(3)小塊的記憶體使用鍊錶訪問效率是低下的,使用陣列通過偏移量訪問記憶體則要高效的多。
ngx_list_t結構體的定義:
typedef struct ngx_list_t;
ngx_list_part_t結構體的定義:
struct ngx_list_part_s ;
初始化陣列鍊錶:
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.nelts = 0; //開始陣列元素中只有0個元素
list->part.next = null;
list->last = &list->part;//指向第乙個節點
list->size = size;
list->nalloc = n;
list->pool = pool;//記憶體池物件
return ngx_ok;
}
建立陣列鍊錶:
ngx_list_t *
ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)//建立乙個鍊錶
if (ngx_list_init(list, pool, n, size) != ngx_ok)
return list;
}
新增新的元素:
void *
ngx_list_push(ngx_list_t *l)
last->elts = ngx_palloc(l->pool, l->nalloc * l->size);//申請節點的儲存記憶體
if (last->elts == 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;
}
nginx原始碼學習 資料結構 ngx str
nginx中關於字串的資料結構位於src core ngx string.c和src core ngx string.h中 先來看一下資料結構 1 typedef struct ngx str t data指標指向字串起始位址,len表示字串的有效長度。這裡面的data並不保證以 0 結尾,所以必須...
nginx原始碼學習 資料結構 ngx int
nginx中關於整型的資料結構位於src core ngx config.h中 結構比較簡單,就是乙個typedef的操作,具體如下 1 typedef intptr t ngx int t 2typedef uintptr t ngx uint t 3 typedef intptr t ngx f...
Nginx原始碼結構
上一章對nginx的架構有了乙個初步的了解。這章,為了對原始碼仔細的剖析,先要對nginx的原始碼結構有乙個了解。從巨集觀上把握原始碼模組的結構。一.nginx原始碼的3個目錄結構 在安裝的nginx的目錄下,有乙個目錄src,這裡邊存放了nginx的所有源 包括 core,event,http,m...