リンクリストデータ構造 - ソースコードnginxのの予備的なデータ構造

はじめにngx_list_t
        ngx_list_t nginxのは、より頻繁にコンテンツデータポインタ取得、メモリベースのメモリ割り当てプールに基づいて、データ構造を使用しています。コンテンツデータは、ポインタに格納されているので、これは理論的ngx_list_t多次元ネットワーク構造を構築するために使用することも、nginxの元のコードは、(実際に必要ではないで)これらのデータ構造の操作に関与していない場合にのみ機能パッケージをリストにリンクされています。

1.データ構造

        nginxのは、リストデータ構造がngx_list_t二つの部分とngx_list_part_sで構成されてリンクさ。ngx_list_part_sデータノードは、各ノードは、リンクされたリストデータは、位置データに格納されたデータとデータポインタと次のノードの数を含んでいます。

struct ngx_list_part_s {
    void             *elts;
    ngx_uint_t        nelts;/*已存储元素个数*/
    ngx_list_part_t  *next;
};

次のようにリンクされたリストの管理・運用を担当ngx_list_t、ヘッダ構造です。

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;

2.基本操作
2.1初期化リスト

         初期化ロジックは非常に単純であり、第一のメモリ・プールの最初のノードを割り当て、最初のノードへの最後のノード点、その上にリスト管理情報の最終更新。

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.elts = ngx_palloc(pool, n * size);
    if (list->part.elts == NULL) {
        return NGX_ERROR;
    }

    list->part.nelts = 0;
    list->part.next = NULL;
    list->last = &list->part;
    list->size = size;
    list->nalloc = n;
    list->pool = pool;

    return NGX_OK;
}

リストの作成2.2

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));
    if (list == NULL) {
        return NULL;
    }

    if (ngx_list_init(list, pool, n, size) != NGX_OK) {
        return NULL;
    }

    return list;
}

2.3の追加要素

          追加された要素の戦いの最後の要素を返し、その後、外部ロジックに要素の内容を追加します。

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;
}

       nginxの鎖構造を動的効果的過剰を回避し、メモリを割り当てることができるメモリに保存するための非常に良好であるメモリを割り当て、プッシュデータメモリ割り当て動作の多数の周波数の増加をもたらすことに留意されたいです問題。

リリース8元の記事 ウォンの賞賛0 ビュー112

おすすめ

転載: blog.csdn.net/mlydaemon/article/details/103945001