1*3da8d17dSfengbojiang(姜凤波)
2*3da8d17dSfengbojiang(姜凤波) /*
3*3da8d17dSfengbojiang(姜凤波) * Copyright (C) Igor Sysoev
4*3da8d17dSfengbojiang(姜凤波) * Copyright (C) Nginx, Inc.
5*3da8d17dSfengbojiang(姜凤波) */
6*3da8d17dSfengbojiang(姜凤波)
7*3da8d17dSfengbojiang(姜凤波)
8*3da8d17dSfengbojiang(姜凤波) #include <ngx_config.h>
9*3da8d17dSfengbojiang(姜凤波) #include <ngx_core.h>
10*3da8d17dSfengbojiang(姜凤波)
11*3da8d17dSfengbojiang(姜凤波)
12*3da8d17dSfengbojiang(姜凤波) ngx_array_t *
ngx_array_create(ngx_pool_t * p,ngx_uint_t n,size_t size)13*3da8d17dSfengbojiang(姜凤波) ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)
14*3da8d17dSfengbojiang(姜凤波) {
15*3da8d17dSfengbojiang(姜凤波) ngx_array_t *a;
16*3da8d17dSfengbojiang(姜凤波)
17*3da8d17dSfengbojiang(姜凤波) a = ngx_palloc(p, sizeof(ngx_array_t));
18*3da8d17dSfengbojiang(姜凤波) if (a == NULL) {
19*3da8d17dSfengbojiang(姜凤波) return NULL;
20*3da8d17dSfengbojiang(姜凤波) }
21*3da8d17dSfengbojiang(姜凤波)
22*3da8d17dSfengbojiang(姜凤波) if (ngx_array_init(a, p, n, size) != NGX_OK) {
23*3da8d17dSfengbojiang(姜凤波) return NULL;
24*3da8d17dSfengbojiang(姜凤波) }
25*3da8d17dSfengbojiang(姜凤波)
26*3da8d17dSfengbojiang(姜凤波) return a;
27*3da8d17dSfengbojiang(姜凤波) }
28*3da8d17dSfengbojiang(姜凤波)
29*3da8d17dSfengbojiang(姜凤波)
30*3da8d17dSfengbojiang(姜凤波) void
ngx_array_destroy(ngx_array_t * a)31*3da8d17dSfengbojiang(姜凤波) ngx_array_destroy(ngx_array_t *a)
32*3da8d17dSfengbojiang(姜凤波) {
33*3da8d17dSfengbojiang(姜凤波) ngx_pool_t *p;
34*3da8d17dSfengbojiang(姜凤波)
35*3da8d17dSfengbojiang(姜凤波) p = a->pool;
36*3da8d17dSfengbojiang(姜凤波)
37*3da8d17dSfengbojiang(姜凤波) if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
38*3da8d17dSfengbojiang(姜凤波) p->d.last -= a->size * a->nalloc;
39*3da8d17dSfengbojiang(姜凤波) }
40*3da8d17dSfengbojiang(姜凤波)
41*3da8d17dSfengbojiang(姜凤波) if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
42*3da8d17dSfengbojiang(姜凤波) p->d.last = (u_char *) a;
43*3da8d17dSfengbojiang(姜凤波) }
44*3da8d17dSfengbojiang(姜凤波) }
45*3da8d17dSfengbojiang(姜凤波)
46*3da8d17dSfengbojiang(姜凤波)
47*3da8d17dSfengbojiang(姜凤波) void *
ngx_array_push(ngx_array_t * a)48*3da8d17dSfengbojiang(姜凤波) ngx_array_push(ngx_array_t *a)
49*3da8d17dSfengbojiang(姜凤波) {
50*3da8d17dSfengbojiang(姜凤波) void *elt, *new;
51*3da8d17dSfengbojiang(姜凤波) size_t size;
52*3da8d17dSfengbojiang(姜凤波) ngx_pool_t *p;
53*3da8d17dSfengbojiang(姜凤波)
54*3da8d17dSfengbojiang(姜凤波) if (a->nelts == a->nalloc) {
55*3da8d17dSfengbojiang(姜凤波)
56*3da8d17dSfengbojiang(姜凤波) /* the array is full */
57*3da8d17dSfengbojiang(姜凤波)
58*3da8d17dSfengbojiang(姜凤波) size = a->size * a->nalloc;
59*3da8d17dSfengbojiang(姜凤波)
60*3da8d17dSfengbojiang(姜凤波) p = a->pool;
61*3da8d17dSfengbojiang(姜凤波)
62*3da8d17dSfengbojiang(姜凤波) if ((u_char *) a->elts + size == p->d.last
63*3da8d17dSfengbojiang(姜凤波) && p->d.last + a->size <= p->d.end)
64*3da8d17dSfengbojiang(姜凤波) {
65*3da8d17dSfengbojiang(姜凤波) /*
66*3da8d17dSfengbojiang(姜凤波) * the array allocation is the last in the pool
67*3da8d17dSfengbojiang(姜凤波) * and there is space for new allocation
68*3da8d17dSfengbojiang(姜凤波) */
69*3da8d17dSfengbojiang(姜凤波)
70*3da8d17dSfengbojiang(姜凤波) p->d.last += a->size;
71*3da8d17dSfengbojiang(姜凤波) a->nalloc++;
72*3da8d17dSfengbojiang(姜凤波)
73*3da8d17dSfengbojiang(姜凤波) } else {
74*3da8d17dSfengbojiang(姜凤波) /* allocate a new array */
75*3da8d17dSfengbojiang(姜凤波)
76*3da8d17dSfengbojiang(姜凤波) new = ngx_palloc(p, 2 * size);
77*3da8d17dSfengbojiang(姜凤波) if (new == NULL) {
78*3da8d17dSfengbojiang(姜凤波) return NULL;
79*3da8d17dSfengbojiang(姜凤波) }
80*3da8d17dSfengbojiang(姜凤波)
81*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(new, a->elts, size);
82*3da8d17dSfengbojiang(姜凤波) a->elts = new;
83*3da8d17dSfengbojiang(姜凤波) a->nalloc *= 2;
84*3da8d17dSfengbojiang(姜凤波) }
85*3da8d17dSfengbojiang(姜凤波) }
86*3da8d17dSfengbojiang(姜凤波)
87*3da8d17dSfengbojiang(姜凤波) elt = (u_char *) a->elts + a->size * a->nelts;
88*3da8d17dSfengbojiang(姜凤波) a->nelts++;
89*3da8d17dSfengbojiang(姜凤波)
90*3da8d17dSfengbojiang(姜凤波) return elt;
91*3da8d17dSfengbojiang(姜凤波) }
92*3da8d17dSfengbojiang(姜凤波)
93*3da8d17dSfengbojiang(姜凤波)
94*3da8d17dSfengbojiang(姜凤波) void *
ngx_array_push_n(ngx_array_t * a,ngx_uint_t n)95*3da8d17dSfengbojiang(姜凤波) ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
96*3da8d17dSfengbojiang(姜凤波) {
97*3da8d17dSfengbojiang(姜凤波) void *elt, *new;
98*3da8d17dSfengbojiang(姜凤波) size_t size;
99*3da8d17dSfengbojiang(姜凤波) ngx_uint_t nalloc;
100*3da8d17dSfengbojiang(姜凤波) ngx_pool_t *p;
101*3da8d17dSfengbojiang(姜凤波)
102*3da8d17dSfengbojiang(姜凤波) size = n * a->size;
103*3da8d17dSfengbojiang(姜凤波)
104*3da8d17dSfengbojiang(姜凤波) if (a->nelts + n > a->nalloc) {
105*3da8d17dSfengbojiang(姜凤波)
106*3da8d17dSfengbojiang(姜凤波) /* the array is full */
107*3da8d17dSfengbojiang(姜凤波)
108*3da8d17dSfengbojiang(姜凤波) p = a->pool;
109*3da8d17dSfengbojiang(姜凤波)
110*3da8d17dSfengbojiang(姜凤波) if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
111*3da8d17dSfengbojiang(姜凤波) && p->d.last + size <= p->d.end)
112*3da8d17dSfengbojiang(姜凤波) {
113*3da8d17dSfengbojiang(姜凤波) /*
114*3da8d17dSfengbojiang(姜凤波) * the array allocation is the last in the pool
115*3da8d17dSfengbojiang(姜凤波) * and there is space for new allocation
116*3da8d17dSfengbojiang(姜凤波) */
117*3da8d17dSfengbojiang(姜凤波)
118*3da8d17dSfengbojiang(姜凤波) p->d.last += size;
119*3da8d17dSfengbojiang(姜凤波) a->nalloc += n;
120*3da8d17dSfengbojiang(姜凤波)
121*3da8d17dSfengbojiang(姜凤波) } else {
122*3da8d17dSfengbojiang(姜凤波) /* allocate a new array */
123*3da8d17dSfengbojiang(姜凤波)
124*3da8d17dSfengbojiang(姜凤波) nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
125*3da8d17dSfengbojiang(姜凤波)
126*3da8d17dSfengbojiang(姜凤波) new = ngx_palloc(p, nalloc * a->size);
127*3da8d17dSfengbojiang(姜凤波) if (new == NULL) {
128*3da8d17dSfengbojiang(姜凤波) return NULL;
129*3da8d17dSfengbojiang(姜凤波) }
130*3da8d17dSfengbojiang(姜凤波)
131*3da8d17dSfengbojiang(姜凤波) ngx_memcpy(new, a->elts, a->nelts * a->size);
132*3da8d17dSfengbojiang(姜凤波) a->elts = new;
133*3da8d17dSfengbojiang(姜凤波) a->nalloc = nalloc;
134*3da8d17dSfengbojiang(姜凤波) }
135*3da8d17dSfengbojiang(姜凤波) }
136*3da8d17dSfengbojiang(姜凤波)
137*3da8d17dSfengbojiang(姜凤波) elt = (u_char *) a->elts + a->size * a->nelts;
138*3da8d17dSfengbojiang(姜凤波) a->nelts += n;
139*3da8d17dSfengbojiang(姜凤波)
140*3da8d17dSfengbojiang(姜凤波) return elt;
141*3da8d17dSfengbojiang(姜凤波) }
142