src/core/ngx_array.c - nginx-1.7.10

Functions defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #include <ngx_config.h>
  6. #include <ngx_core.h>


  7. ngx_array_t *
  8. ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)
  9. {
  10.     ngx_array_t *a;

  11.     a = ngx_palloc(p, sizeof(ngx_array_t));
  12.     if (a == NULL) {
  13.         return NULL;
  14.     }

  15.     if (ngx_array_init(a, p, n, size) != NGX_OK) {
  16.         return NULL;
  17.     }

  18.     return a;
  19. }


  20. void
  21. ngx_array_destroy(ngx_array_t *a)
  22. {
  23.     ngx_pool_t  *p;

  24.     p = a->pool;

  25.     if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
  26.         p->d.last -= a->size * a->nalloc;
  27.     }

  28.     if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
  29.         p->d.last = (u_char *) a;
  30.     }
  31. }


  32. void *
  33. ngx_array_push(ngx_array_t *a)
  34. {
  35.     void        *elt, *new;
  36.     size_t       size;
  37.     ngx_pool_t  *p;

  38.     if (a->nelts == a->nalloc) {

  39.         /* the array is full */

  40.         size = a->size * a->nalloc;

  41.         p = a->pool;

  42.         if ((u_char *) a->elts + size == p->d.last
  43.             && p->d.last + a->size <= p->d.end)
  44.         {
  45.             /*
  46.              * the array allocation is the last in the pool
  47.              * and there is space for new allocation
  48.              */

  49.             p->d.last += a->size;
  50.             a->nalloc++;

  51.         } else {
  52.             /* allocate a new array */

  53.             new = ngx_palloc(p, 2 * size);
  54.             if (new == NULL) {
  55.                 return NULL;
  56.             }

  57.             ngx_memcpy(new, a->elts, size);
  58.             a->elts = new;
  59.             a->nalloc *= 2;
  60.         }
  61.     }

  62.     elt = (u_char *) a->elts + a->size * a->nelts;
  63.     a->nelts++;

  64.     return elt;
  65. }


  66. void *
  67. ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
  68. {
  69.     void        *elt, *new;
  70.     size_t       size;
  71.     ngx_uint_t   nalloc;
  72.     ngx_pool_t  *p;

  73.     size = n * a->size;

  74.     if (a->nelts + n > a->nalloc) {

  75.         /* the array is full */

  76.         p = a->pool;

  77.         if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
  78.             && p->d.last + size <= p->d.end)
  79.         {
  80.             /*
  81.              * the array allocation is the last in the pool
  82.              * and there is space for new allocation
  83.              */

  84.             p->d.last += size;
  85.             a->nalloc += n;

  86.         } else {
  87.             /* allocate a new array */

  88.             nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);

  89.             new = ngx_palloc(p, nalloc * a->size);
  90.             if (new == NULL) {
  91.                 return NULL;
  92.             }

  93.             ngx_memcpy(new, a->elts, a->nelts * a->size);
  94.             a->elts = new;
  95.             a->nalloc = nalloc;
  96.         }
  97.     }

  98.     elt = (u_char *) a->elts + a->size * a->nelts;
  99.     a->nelts += n;

  100.     return elt;
  101. }