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