diff options
author | Max Romanov <max.romanov@nginx.com> | 2017-06-23 19:20:08 +0300 |
---|---|---|
committer | Max Romanov <max.romanov@nginx.com> | 2017-06-23 19:20:08 +0300 |
commit | 4a1b59c27a8e85fc3b03c420fbc1642ce52e96cf (patch) | |
tree | c72ab253541c53dd918afc86973192416078fceb /src/nginext/nxt_go_array.c | |
parent | 5a43bd0bfd1eaa60dede7beb3206a53e8d008fa4 (diff) | |
download | unit-4a1b59c27a8e85fc3b03c420fbc1642ce52e96cf.tar.gz unit-4a1b59c27a8e85fc3b03c420fbc1642ce52e96cf.tar.bz2 |
External Go app request processing.
Diffstat (limited to 'src/nginext/nxt_go_array.c')
-rw-r--r-- | src/nginext/nxt_go_array.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/nginext/nxt_go_array.c b/src/nginext/nxt_go_array.c new file mode 100644 index 00000000..a788811a --- /dev/null +++ b/src/nginext/nxt_go_array.c @@ -0,0 +1,66 @@ + +/* + * Copyright (C) Max Romanov + * Copyright (C) NGINX, Inc. + */ + +#ifndef NXT_CONFIGURE + +#include <stdint.h> +#include <sys/types.h> + +#include <nxt_main.h> + +#include "nxt_go_array.h" + +void +nxt_go_array_init(nxt_array_t *array, nxt_uint_t n, size_t size) +{ + array->elts = malloc(n * size); + + if (nxt_slow_path(n != 0 && array->elts == NULL)) { + return; + } + + array->nelts = 0; + array->size = size; + array->nalloc = n; + array->mem_pool = NULL; +} + +void * +nxt_go_array_add(nxt_array_t *array) +{ + void *p; + uint32_t nalloc, new_alloc; + + nalloc = array->nalloc; + + if (array->nelts == nalloc) { + + if (nalloc < 16) { + /* Allocate new array twice larger than current. */ + new_alloc = nalloc * 2; + + } else { + /* Allocate new array 1.5 times larger than current. */ + new_alloc = nalloc + nalloc / 2; + } + + p = realloc(array->elts, array->size * new_alloc); + + if (nxt_slow_path(p == NULL)) { + return NULL; + } + + array->elts = p; + array->nalloc = new_alloc; + } + + p = (char *) array->elts + array->size * array->nelts; + array->nelts++; + + return p; +} + +#endif /* NXT_CONFIGURE */ |