Return to ngx_array.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / nginx / src / core |
1.1 ! misho 1: ! 2: /* ! 3: * Copyright (C) Igor Sysoev ! 4: * Copyright (C) Nginx, Inc. ! 5: */ ! 6: ! 7: ! 8: #include <ngx_config.h> ! 9: #include <ngx_core.h> ! 10: ! 11: ! 12: ngx_array_t * ! 13: ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size) ! 14: { ! 15: ngx_array_t *a; ! 16: ! 17: a = ngx_palloc(p, sizeof(ngx_array_t)); ! 18: if (a == NULL) { ! 19: return NULL; ! 20: } ! 21: ! 22: if (ngx_array_init(a, p, n, size) != NGX_OK) { ! 23: return NULL; ! 24: } ! 25: ! 26: return a; ! 27: } ! 28: ! 29: ! 30: void ! 31: ngx_array_destroy(ngx_array_t *a) ! 32: { ! 33: ngx_pool_t *p; ! 34: ! 35: p = a->pool; ! 36: ! 37: if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) { ! 38: p->d.last -= a->size * a->nalloc; ! 39: } ! 40: ! 41: if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) { ! 42: p->d.last = (u_char *) a; ! 43: } ! 44: } ! 45: ! 46: ! 47: void * ! 48: ngx_array_push(ngx_array_t *a) ! 49: { ! 50: void *elt, *new; ! 51: size_t size; ! 52: ngx_pool_t *p; ! 53: ! 54: if (a->nelts == a->nalloc) { ! 55: ! 56: /* the array is full */ ! 57: ! 58: size = a->size * a->nalloc; ! 59: ! 60: p = a->pool; ! 61: ! 62: if ((u_char *) a->elts + size == p->d.last ! 63: && p->d.last + a->size <= p->d.end) ! 64: { ! 65: /* ! 66: * the array allocation is the last in the pool ! 67: * and there is space for new allocation ! 68: */ ! 69: ! 70: p->d.last += a->size; ! 71: a->nalloc++; ! 72: ! 73: } else { ! 74: /* allocate a new array */ ! 75: ! 76: new = ngx_palloc(p, 2 * size); ! 77: if (new == NULL) { ! 78: return NULL; ! 79: } ! 80: ! 81: ngx_memcpy(new, a->elts, size); ! 82: a->elts = new; ! 83: a->nalloc *= 2; ! 84: } ! 85: } ! 86: ! 87: elt = (u_char *) a->elts + a->size * a->nelts; ! 88: a->nelts++; ! 89: ! 90: return elt; ! 91: } ! 92: ! 93: ! 94: void * ! 95: ngx_array_push_n(ngx_array_t *a, ngx_uint_t n) ! 96: { ! 97: void *elt, *new; ! 98: size_t size; ! 99: ngx_uint_t nalloc; ! 100: ngx_pool_t *p; ! 101: ! 102: size = n * a->size; ! 103: ! 104: if (a->nelts + n > a->nalloc) { ! 105: ! 106: /* the array is full */ ! 107: ! 108: p = a->pool; ! 109: ! 110: if ((u_char *) a->elts + a->size * a->nalloc == p->d.last ! 111: && p->d.last + size <= p->d.end) ! 112: { ! 113: /* ! 114: * the array allocation is the last in the pool ! 115: * and there is space for new allocation ! 116: */ ! 117: ! 118: p->d.last += size; ! 119: a->nalloc += n; ! 120: ! 121: } else { ! 122: /* allocate a new array */ ! 123: ! 124: nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc); ! 125: ! 126: new = ngx_palloc(p, nalloc * a->size); ! 127: if (new == NULL) { ! 128: return NULL; ! 129: } ! 130: ! 131: ngx_memcpy(new, a->elts, a->nelts * a->size); ! 132: a->elts = new; ! 133: a->nalloc = nalloc; ! 134: } ! 135: } ! 136: ! 137: elt = (u_char *) a->elts + a->size * a->nelts; ! 138: a->nelts += n; ! 139: ! 140: return elt; ! 141: }