upstream nginx-0.7.35
[nginx.git] / nginx / src / core / ngx_list.c
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #include <ngx_config.h>
8 #include <ngx_core.h>
9
10
11 ngx_list_t *
12 ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)
13 {
14     ngx_list_t  *list;
15
16     list = ngx_palloc(pool, sizeof(ngx_list_t));
17     if (list == NULL) {
18         return NULL;
19     }
20
21     list->part.elts = ngx_palloc(pool, n * size);
22     if (list->part.elts == NULL) {
23         return NULL;
24     }
25
26     list->part.nelts = 0;
27     list->part.next = NULL;
28     list->last = &list->part;
29     list->size = size;
30     list->nalloc = n;
31     list->pool = pool;
32
33     return list;
34 }
35
36
37 void *
38 ngx_list_push(ngx_list_t *l)
39 {
40     void             *elt;
41     ngx_list_part_t  *last;
42
43     last = l->last;
44
45     if (last->nelts == l->nalloc) {
46
47         /* the last part is full, allocate a new list part */
48
49         last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));
50         if (last == NULL) {
51             return NULL;
52         }
53
54         last->elts = ngx_palloc(l->pool, l->nalloc * l->size);
55         if (last->elts == NULL) {
56             return NULL;
57         }
58
59         last->nelts = 0;
60         last->next = NULL;
61
62         l->last->next = last;
63         l->last = last;
64     }
65
66     elt = (char *) last->elts + l->size * last->nelts;
67     last->nelts++;
68
69     return elt;
70 }