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