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