aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_palloc.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2004-06-06 19:49:18 +0000
committerIgor Sysoev <igor@sysoev.ru>2004-06-06 19:49:18 +0000
commit0ab91b901299ac41e3867ebec7e04e5082a4c8b4 (patch)
treeb89e863c141bc482c85c351f84d9dca1d3570789 /src/core/ngx_palloc.c
parent6e1bbd78967660b49e3a120bbeec6382ed193d5f (diff)
downloadnginx-0ab91b901299ac41e3867ebec7e04e5082a4c8b4.tar.gz
nginx-0ab91b901299ac41e3867ebec7e04e5082a4c8b4.zip
nginx-0.0.3-2004-06-06-23:49:18 import
Diffstat (limited to 'src/core/ngx_palloc.c')
-rw-r--r--src/core/ngx_palloc.c198
1 files changed, 198 insertions, 0 deletions
diff --git a/src/core/ngx_palloc.c b/src/core/ngx_palloc.c
new file mode 100644
index 000000000..65e2eed66
--- /dev/null
+++ b/src/core/ngx_palloc.c
@@ -0,0 +1,198 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)
+{
+ ngx_pool_t *p;
+
+ if (!(p = ngx_alloc(size, log))) {
+ return NULL;
+ }
+
+ p->last = (char *) p + sizeof(ngx_pool_t);
+ p->end = (char *) p + size;
+ p->next = NULL;
+ p->large = NULL;
+ p->log = log;
+
+ return p;
+}
+
+
+void ngx_destroy_pool(ngx_pool_t *pool)
+{
+ ngx_pool_t *p, *n;
+ ngx_pool_large_t *l;
+
+ for (l = pool->large; l; l = l->next) {
+
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
+ "free: " PTR_FMT, l->alloc);
+
+ if (l->alloc) {
+ free(l->alloc);
+ }
+ }
+
+#if (NGX_DEBUG)
+
+ /*
+ * we could allocate the pool->log from this pool
+ * so we can not use this log while the free()ing the pool
+ */
+
+ for (p = pool, n = pool->next; /* void */; p = n, n = n->next) {
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
+ "free: " PTR_FMT, p);
+
+ if (n == NULL) {
+ break;
+ }
+ }
+
+#endif
+
+ for (p = pool, n = pool->next; /* void */; p = n, n = n->next) {
+ free(p);
+
+ if (n == NULL) {
+ break;
+ }
+ }
+}
+
+
+void *ngx_palloc(ngx_pool_t *pool, size_t size)
+{
+ char *m;
+ ngx_pool_t *p, *n;
+ ngx_pool_large_t *large, *last;
+
+ if (size <= (size_t) NGX_MAX_ALLOC_FROM_POOL) {
+
+ for (p = pool, n = pool->next; /* void */; p = n, n = n->next) {
+ m = ngx_align(p->last);
+
+ if ((size_t) (p->end - m) >= size) {
+ p->last = m + size ;
+
+ return m;
+ }
+
+ if (n == NULL) {
+ break;
+ }
+ }
+
+ /* alloc a new pool block */
+
+ if (!(n = ngx_create_pool((size_t) (p->end - (char *) p), p->log))) {
+ return NULL;
+ }
+
+ p->next = n;
+ m = n->last;
+ n->last += size;
+
+ return m;
+ }
+
+ /* alloc a large block */
+
+ large = NULL;
+ last = NULL;
+
+ if (pool->large) {
+ for (last = pool->large; /* void */; last = last->next) {
+ if (last->alloc == NULL) {
+ large = last;
+ last = NULL;
+ break;
+ }
+
+ if (last->next == NULL) {
+ break;
+ }
+ }
+ }
+
+ if (large == NULL) {
+ if (!(large = ngx_palloc(pool, sizeof(ngx_pool_large_t)))) {
+ return NULL;
+ }
+
+ large->next = NULL;
+ }
+
+ if (!(p = ngx_memalign(ngx_pagesize, size, pool->log))) {
+ return NULL;
+ }
+
+ if (pool->large == NULL) {
+ pool->large = large;
+
+ } else if (last) {
+ last->next = large;
+ }
+
+ large->alloc = p;
+
+ return p;
+}
+
+
+void ngx_pfree(ngx_pool_t *pool, void *p)
+{
+ ngx_pool_large_t *l;
+
+ for (l = pool->large; l; l = l->next) {
+ if (p == l->alloc) {
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
+ "free: " PTR_FMT, l->alloc);
+ free(l->alloc);
+ l->alloc = NULL;
+ }
+ }
+}
+
+
+void *ngx_pcalloc(ngx_pool_t *pool, size_t size)
+{
+ void *p;
+
+ p = ngx_palloc(pool, size);
+ if (p) {
+ ngx_memzero(p, size);
+ }
+
+ return p;
+}
+
+#if 0
+
+static void *ngx_get_cached_block(size_t size)
+{
+ void *p;
+ ngx_cached_block_slot_t *slot;
+
+ if (ngx_cycle->cache == NULL) {
+ return NULL;
+ }
+
+ slot = &ngx_cycle->cache[(size + ngx_pagesize - 1) / ngx_pagesize];
+
+ slot->tries++;
+
+ if (slot->number) {
+ p = slot->block;
+ slot->block = slot->block->next;
+ slot->number--;
+ return p;
+ }
+
+ return NULL;
+}
+
+#endif