nginx源碼那些事之array結構分析

        對於nginx來說,包含很多結構體,array便是其中之一。

       array結構體聲明如下:

   struct ngx_array_s {
    void        *elts;  //分配元素首地址
    ngx_uint_t   nelts;//當前使用數
    size_t       size;//分配元素大小
    ngx_uint_t   nalloc;//分配數
    ngx_pool_t  *pool;//指向分配內存池
    };

      array結構包含幾個重要的函數:

       對於ngx_array_create()函數,函數參數中沒有array對象的指針。這個函數在內存池中創建一個array對象,並且分配n個元素,元素大小爲size

   對於函數ngx_array_push(),比較重要的是如下代碼:

  if ((u_char *) a->elts + size == p->d.last
            && p->d.last + a->size <= p->d.end)//如果插入一個成員後,pool的last值沒超過end,進行分配,並設置相應的參數
        {
            p->d.last += a->size;
            a->nalloc++;

        } else {  //如果last值超過end值,則在pool上重新分配array,大小爲原大小的2倍
            new = ngx_palloc(p, 2 * size);
            if (new == NULL) {
                return NULL;
            }

            ngx_memcpy(new, a->elts, size);
            a->elts = new;
            a->nalloc *= 2;
        }

    ngx_array_push()函數,將array對象當作堆棧,作壓棧處理。如果當前內存池沒有空閒空間可用,就會申請新的內存池並且創建一個是原來array對象兩倍大小的新array,原array對象中的元素複製到新array中。

   ngx_array_push_n()函數,與ngx_array_push()函數功能類似。ngx_array_push_n()是壓n個元素,ngx_array_push()壓入一個元素。

    以上就是對array的分析,還需更加努力,參透代碼,領悟精華!


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章