ngx_array.h
/* */#ifndef _ngx_array_h_included_
#define _ngx_array_h_included_#include
#include
typedef
struct
ngx_array_t;
//建立陣列(記憶體池,初始容量,元素大小)
ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);
//銷毀陣列(目標陣列)
void ngx_array_destroy(ngx_array_t *a);
//新增元素(目標陣列)
void *ngx_array_push(ngx_array_t *a);
//新增n個元素(目標陣列,元素數量)
void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);
//初始化陣列(目標陣列,記憶體池,初始容量,元素大小)
static
ngx_inline ngx_int_t
ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)
return
ngx_ok;
}#endif /* _ngx_array_h_included_ */
ngx_array.c
/* */#include
#include
//建立陣列(記憶體池,初始容量,元素大小)
ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)
//初始化陣列(目標陣列,記憶體池,初始容量,元素大小)
if (ngx_array_init(a, p, n, size) !=ngx_ok)
returna;}
//銷毀陣列(目標陣列)
void
ngx_array_destroy(ngx_array_t *a)
//判斷陣列是否位於記憶體塊的最後位置,如果是直接調整記憶體的引數進行刪除
if ((u_char *) a + sizeof(ngx_array_t) == p->d.last)
//如果不是,則由記憶體池自行**}//
新增元素(目標陣列)
void *ngx_array_push(ngx_array_t *a)
else
ngx_memcpy(
new, a->elts, size);
a->elts = new
; a->nalloc *= 2
; }
}//elts指標,指向記憶體塊
elt = (u_char *) a->elts + a->size * a->nelts;
//累加元素數量
a->nelts++;
//返回新元素
return
elt;}//
新增n個元素(目標陣列,元素數量)
void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
else
ngx_memcpy(
new, a->elts, a->nelts * a->size);
a->elts = new
; a->nalloc =nalloc;}}
//elt指標,指向第乙個新元素的記憶體位址
elt = (u_char *) a->elts + a->size * a->nelts;
//累加元素數量
a->nelts +=n;
//返回第乙個新元素
return
elt;
}
nginx 原始碼分析
近期準備研究一下nginx原始碼,此處記錄一下。計畫 1 了解evan miller 的文章 2 了解nginx的組織架構 3 了解nginx的基本資料結構 4 熟悉nginx的主要module及執行機制,主要是core http event os 5 簡單的module開發及測試 一 準備 為了方...
nginx原始碼分析 從原始碼看nginx框架總結
nginx原始碼總結 1 中沒有特別繞特別彆扭的編碼實現,從變數的定義呼叫函式的實現封裝,都非常恰當,比如從函式命名或者變數命名就可以看出來定義的大體意義,函式的基本功能,再好的架構實現在編碼習慣差的人實現也會黯然失色,如果透徹理解 的實現,領悟架構的設計初衷,覺得每塊 就想經過耐心雕琢一樣,不僅僅...
Nginx原始碼分析 connections陣列
本文的標題讓我糾結了好久,不知道是connections陣列合適,還是connections鍊錶更合適 nginx在此或多或少的注入了二者的特點,先不管是叫陣列還是叫鍊錶吧,只要能夠弄明白這個connections是怎麼回事就大功告成。nginx的每個worker程序都使用乙個相同的connecti...