xref: /unit/src/nxt_array.c (revision 0)
1*0Sigor@sysoev.ru 
2*0Sigor@sysoev.ru /*
3*0Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
4*0Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
5*0Sigor@sysoev.ru  */
6*0Sigor@sysoev.ru 
7*0Sigor@sysoev.ru #include <nxt_main.h>
8*0Sigor@sysoev.ru 
9*0Sigor@sysoev.ru 
10*0Sigor@sysoev.ru nxt_array_t *
11*0Sigor@sysoev.ru nxt_array_create(nxt_mem_pool_t *mp, nxt_uint_t n, size_t size)
12*0Sigor@sysoev.ru {
13*0Sigor@sysoev.ru     nxt_array_t  *array;
14*0Sigor@sysoev.ru 
15*0Sigor@sysoev.ru     array = nxt_mem_alloc(mp, sizeof(nxt_array_t) + n * size);
16*0Sigor@sysoev.ru 
17*0Sigor@sysoev.ru     if (nxt_slow_path(array == NULL)) {
18*0Sigor@sysoev.ru         return NULL;
19*0Sigor@sysoev.ru     }
20*0Sigor@sysoev.ru 
21*0Sigor@sysoev.ru     array->elts = (char *) array + sizeof(nxt_array_t);
22*0Sigor@sysoev.ru     array->nelts = 0;
23*0Sigor@sysoev.ru     array->size = size;
24*0Sigor@sysoev.ru     array->nalloc = n;
25*0Sigor@sysoev.ru     array->mem_pool = mp;
26*0Sigor@sysoev.ru 
27*0Sigor@sysoev.ru     return array;
28*0Sigor@sysoev.ru }
29*0Sigor@sysoev.ru 
30*0Sigor@sysoev.ru 
31*0Sigor@sysoev.ru void *
32*0Sigor@sysoev.ru nxt_array_add(nxt_array_t *array)
33*0Sigor@sysoev.ru {
34*0Sigor@sysoev.ru     void      *p;
35*0Sigor@sysoev.ru     uint32_t  nalloc, new_alloc;
36*0Sigor@sysoev.ru 
37*0Sigor@sysoev.ru     nalloc = array->nalloc;
38*0Sigor@sysoev.ru 
39*0Sigor@sysoev.ru     if (array->nelts == nalloc) {
40*0Sigor@sysoev.ru 
41*0Sigor@sysoev.ru         if (nalloc < 16) {
42*0Sigor@sysoev.ru             /* Allocate new array twice larger than current. */
43*0Sigor@sysoev.ru             new_alloc = nalloc * 2;
44*0Sigor@sysoev.ru 
45*0Sigor@sysoev.ru         } else {
46*0Sigor@sysoev.ru             /* Allocate new array 1.5 times larger than current. */
47*0Sigor@sysoev.ru             new_alloc = nalloc + nalloc / 2;
48*0Sigor@sysoev.ru         }
49*0Sigor@sysoev.ru 
50*0Sigor@sysoev.ru         p = nxt_mem_alloc(array->mem_pool, array->size * new_alloc);
51*0Sigor@sysoev.ru 
52*0Sigor@sysoev.ru         if (nxt_slow_path(p == NULL)) {
53*0Sigor@sysoev.ru             return NULL;
54*0Sigor@sysoev.ru         }
55*0Sigor@sysoev.ru 
56*0Sigor@sysoev.ru         nxt_memcpy(p, array->elts, array->size * nalloc);
57*0Sigor@sysoev.ru 
58*0Sigor@sysoev.ru         array->elts = p;
59*0Sigor@sysoev.ru         array->nalloc = new_alloc;
60*0Sigor@sysoev.ru     }
61*0Sigor@sysoev.ru 
62*0Sigor@sysoev.ru     p = (char *) array->elts + array->size * array->nelts;
63*0Sigor@sysoev.ru     array->nelts++;
64*0Sigor@sysoev.ru 
65*0Sigor@sysoev.ru     return p;
66*0Sigor@sysoev.ru }
67*0Sigor@sysoev.ru 
68*0Sigor@sysoev.ru 
69*0Sigor@sysoev.ru void *
70*0Sigor@sysoev.ru nxt_array_zero_add(nxt_array_t *array)
71*0Sigor@sysoev.ru {
72*0Sigor@sysoev.ru     void  *p;
73*0Sigor@sysoev.ru 
74*0Sigor@sysoev.ru     p = nxt_array_add(array);
75*0Sigor@sysoev.ru 
76*0Sigor@sysoev.ru     if (nxt_fast_path(p != NULL)) {
77*0Sigor@sysoev.ru         nxt_memzero(p, array->size);
78*0Sigor@sysoev.ru     }
79*0Sigor@sysoev.ru 
80*0Sigor@sysoev.ru     return p;
81*0Sigor@sysoev.ru }
82*0Sigor@sysoev.ru 
83*0Sigor@sysoev.ru 
84*0Sigor@sysoev.ru void
85*0Sigor@sysoev.ru nxt_array_remove(nxt_array_t *array, void *elt)
86*0Sigor@sysoev.ru {
87*0Sigor@sysoev.ru     void  *last;
88*0Sigor@sysoev.ru 
89*0Sigor@sysoev.ru     last = nxt_array_last(array);
90*0Sigor@sysoev.ru 
91*0Sigor@sysoev.ru     if (elt != last) {
92*0Sigor@sysoev.ru         nxt_memcpy(elt, last, array->size);
93*0Sigor@sysoev.ru     }
94*0Sigor@sysoev.ru 
95*0Sigor@sysoev.ru     array->nelts--;
96*0Sigor@sysoev.ru }
97