xref: /unit/src/nxt_array.c (revision 98)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru  */
60Sigor@sysoev.ru 
70Sigor@sysoev.ru #include <nxt_main.h>
80Sigor@sysoev.ru 
90Sigor@sysoev.ru 
100Sigor@sysoev.ru nxt_array_t *
1165Sigor@sysoev.ru nxt_array_create(nxt_mp_t *mp, nxt_uint_t n, size_t size)
120Sigor@sysoev.ru {
130Sigor@sysoev.ru     nxt_array_t  *array;
140Sigor@sysoev.ru 
1565Sigor@sysoev.ru     array = nxt_mp_alloc(mp, sizeof(nxt_array_t) + n * size);
160Sigor@sysoev.ru 
170Sigor@sysoev.ru     if (nxt_slow_path(array == NULL)) {
180Sigor@sysoev.ru         return NULL;
190Sigor@sysoev.ru     }
200Sigor@sysoev.ru 
21*98Svbart@nginx.com     array->elts = nxt_pointer_to(array, sizeof(nxt_array_t));
220Sigor@sysoev.ru     array->nelts = 0;
230Sigor@sysoev.ru     array->size = size;
240Sigor@sysoev.ru     array->nalloc = n;
250Sigor@sysoev.ru     array->mem_pool = mp;
260Sigor@sysoev.ru 
270Sigor@sysoev.ru     return array;
280Sigor@sysoev.ru }
290Sigor@sysoev.ru 
300Sigor@sysoev.ru 
310Sigor@sysoev.ru void *
320Sigor@sysoev.ru nxt_array_add(nxt_array_t *array)
330Sigor@sysoev.ru {
340Sigor@sysoev.ru     void      *p;
350Sigor@sysoev.ru     uint32_t  nalloc, new_alloc;
360Sigor@sysoev.ru 
370Sigor@sysoev.ru     nalloc = array->nalloc;
380Sigor@sysoev.ru 
390Sigor@sysoev.ru     if (array->nelts == nalloc) {
400Sigor@sysoev.ru 
410Sigor@sysoev.ru         if (nalloc < 16) {
420Sigor@sysoev.ru             /* Allocate new array twice larger than current. */
430Sigor@sysoev.ru             new_alloc = nalloc * 2;
440Sigor@sysoev.ru 
450Sigor@sysoev.ru         } else {
460Sigor@sysoev.ru             /* Allocate new array 1.5 times larger than current. */
470Sigor@sysoev.ru             new_alloc = nalloc + nalloc / 2;
480Sigor@sysoev.ru         }
490Sigor@sysoev.ru 
5065Sigor@sysoev.ru         p = nxt_mp_alloc(array->mem_pool, array->size * new_alloc);
510Sigor@sysoev.ru 
520Sigor@sysoev.ru         if (nxt_slow_path(p == NULL)) {
530Sigor@sysoev.ru             return NULL;
540Sigor@sysoev.ru         }
550Sigor@sysoev.ru 
560Sigor@sysoev.ru         nxt_memcpy(p, array->elts, array->size * nalloc);
570Sigor@sysoev.ru 
5865Sigor@sysoev.ru         nxt_mp_free(array->mem_pool, array->elts);
5965Sigor@sysoev.ru 
600Sigor@sysoev.ru         array->elts = p;
610Sigor@sysoev.ru         array->nalloc = new_alloc;
620Sigor@sysoev.ru     }
630Sigor@sysoev.ru 
64*98Svbart@nginx.com     p = nxt_pointer_to(array->elts, array->size * array->nelts);
650Sigor@sysoev.ru     array->nelts++;
660Sigor@sysoev.ru 
670Sigor@sysoev.ru     return p;
680Sigor@sysoev.ru }
690Sigor@sysoev.ru 
700Sigor@sysoev.ru 
710Sigor@sysoev.ru void *
720Sigor@sysoev.ru nxt_array_zero_add(nxt_array_t *array)
730Sigor@sysoev.ru {
740Sigor@sysoev.ru     void  *p;
750Sigor@sysoev.ru 
760Sigor@sysoev.ru     p = nxt_array_add(array);
770Sigor@sysoev.ru 
780Sigor@sysoev.ru     if (nxt_fast_path(p != NULL)) {
790Sigor@sysoev.ru         nxt_memzero(p, array->size);
800Sigor@sysoev.ru     }
810Sigor@sysoev.ru 
820Sigor@sysoev.ru     return p;
830Sigor@sysoev.ru }
840Sigor@sysoev.ru 
850Sigor@sysoev.ru 
860Sigor@sysoev.ru void
870Sigor@sysoev.ru nxt_array_remove(nxt_array_t *array, void *elt)
880Sigor@sysoev.ru {
890Sigor@sysoev.ru     void  *last;
900Sigor@sysoev.ru 
910Sigor@sysoev.ru     last = nxt_array_last(array);
920Sigor@sysoev.ru 
930Sigor@sysoev.ru     if (elt != last) {
940Sigor@sysoev.ru         nxt_memcpy(elt, last, array->size);
950Sigor@sysoev.ru     }
960Sigor@sysoev.ru 
970Sigor@sysoev.ru     array->nelts--;
980Sigor@sysoev.ru }
99