xref: /f-stack/app/nginx-1.16.1/src/core/ngx_array.c (revision 3da8d17d)
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