nginx 소스 학습 노트 (11) - 기본 용기 - ngxlist

2599 단어 nginx
ngx_list. {c | h} 구 조 는 매우 간단 합 니 다. 만약 당신 이 이전의 array 소 개 를 보 았 다 면 이 절 은 지나 갈 수 있 습 니 다.
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 동작:
//  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;
}
//    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] ...

}

좋은 웹페이지 즐겨찾기