aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_palloc.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2008-06-17 15:00:30 +0000
committerIgor Sysoev <igor@sysoev.ru>2008-06-17 15:00:30 +0000
commit7f6b2ffc60135a8340213fe8d5d0b70e479e3ac1 (patch)
tree90325238fc9a9d9a7e8818e76b60cc9e011242aa /src/core/ngx_palloc.c
parentc2eb2cf4cba5f47fbc33eebe279f0d3855401421 (diff)
downloadnginx-7f6b2ffc60135a8340213fe8d5d0b70e479e3ac1.tar.gz
nginx-7f6b2ffc60135a8340213fe8d5d0b70e479e3ac1.zip
*) back out r2040
*) refactor ngx_palloc() *) introduce ngx_pnalloc() *) additional pool blocks have smaller header
Diffstat (limited to 'src/core/ngx_palloc.c')
-rw-r--r--src/core/ngx_palloc.c143
1 files changed, 86 insertions, 57 deletions
diff --git a/src/core/ngx_palloc.c b/src/core/ngx_palloc.c
index 130c67056..64f958e5a 100644
--- a/src/core/ngx_palloc.c
+++ b/src/core/ngx_palloc.c
@@ -8,6 +8,10 @@
#include <ngx_core.h>
+static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
+static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
+
+
ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
@@ -18,11 +22,14 @@ ngx_create_pool(size_t size, ngx_log_t *log)
return NULL;
}
- p->last = (u_char *) p + sizeof(ngx_pool_t);
- p->end = (u_char *) p + size;
+ p->d.last = (u_char *) p + sizeof(ngx_pool_t);
+ p->d.end = (u_char *) p + size;
+ p->d.next = NULL;
+
+ p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size - sizeof(ngx_pool_t):
+ NGX_MAX_ALLOC_FROM_POOL;
p->current = p;
p->chain = NULL;
- p->next = NULL;
p->large = NULL;
p->cleanup = NULL;
p->log = log;
@@ -62,9 +69,9 @@ ngx_destroy_pool(ngx_pool_t *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) {
+ for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
- "free: %p, unused: %uz", p, p->end - p->last);
+ "free: %p, unused: %uz", p, p->d.end - p->d.last);
if (n == NULL) {
break;
@@ -73,7 +80,7 @@ ngx_destroy_pool(ngx_pool_t *pool)
#endif
- for (p = pool, n = pool->next; /* void */; p = n, n = n->next) {
+ for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
ngx_free(p);
if (n == NULL) {
@@ -86,66 +93,99 @@ ngx_destroy_pool(ngx_pool_t *pool)
void *
ngx_palloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- ngx_pool_t *p, *n, *current;
- ngx_pool_large_t *large;
+ u_char *m;
+ ngx_pool_t *p;
- if (size <= (size_t) NGX_MAX_ALLOC_FROM_POOL
- && size <= (size_t) (pool->end - (u_char *) pool)
- - (size_t) ngx_align_ptr(sizeof(ngx_pool_t), NGX_ALIGNMENT))
- {
- p = pool->current;
- current = p;
+ if (size <= pool->max) {
- for ( ;; ) {
+ p = pool->current;
- /*
- * allow non-aligned memory blocks for small allocations (1, 2,
- * or 3 bytes) and for odd length strings (struct's have aligned
- * size)
- */
+ do {
+ m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
- if (size < sizeof(int) || (size & 1)) {
- m = p->last;
+ if ((size_t) (p->d.end - m) >= size) {
+ p->d.last = m + size;
- } else {
- m = ngx_align_ptr(p->last, NGX_ALIGNMENT);
+ return m;
}
- if ((size_t) (p->end - m) >= size) {
- p->last = m + size;
+ p = p->d.next;
+
+ } while (p);
+
+ return ngx_palloc_block(pool, size);
+ }
+
+ return ngx_palloc_large(pool, size);
+}
+
+
+void *
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
+{
+ u_char *m;
+ ngx_pool_t *p;
+
+ if (size <= pool->max) {
+
+ p = pool->current;
+
+ do {
+ m = p->d.last;
+
+ if ((size_t) (p->d.end - m) >= size) {
+ p->d.last = m + size;
return m;
}
- if ((size_t) (p->end - m) < NGX_ALIGNMENT) {
- current = p->next;
- }
+ p = p->d.next;
- if (p->next == NULL) {
- break;
- }
+ } while (p);
- p = p->next;
- pool->current = current;
- }
+ return ngx_palloc_block(pool, size);
+ }
- /* allocate a new pool block */
+ return ngx_palloc_large(pool, size);
+}
- n = ngx_create_pool((size_t) (p->end - (u_char *) p), p->log);
- if (n == NULL) {
- return NULL;
- }
- pool->current = current ? current : n;
+static void *
+ngx_palloc_block(ngx_pool_t *pool, size_t size)
+{
+ u_char *m;
+ ngx_pool_t *p, *new, *current;
+
+ new = ngx_create_pool((size_t) (pool->d.end - (u_char *) pool), pool->log);
+ if (new == NULL) {
+ return NULL;
+ }
- p->next = n;
- m = ngx_align_ptr(n->last, NGX_ALIGNMENT);
- n->last = m + size;
+ current = pool->current;
- return m;
+ for (p = current; p->d.next; p = p->d.next) {
+ if ((size_t) (p->d.end - p->d.last) < NGX_ALIGNMENT) {
+ current = p->d.next;
+ }
}
+ p->d.next = new;
+
+ pool->current = current ? current : new;
+
+ m = (u_char *) new + sizeof(ngx_pool_data_t);
+ new->d.last = m + size;
+
+ return m;
+}
+
+
+static void *
+ngx_palloc_large(ngx_pool_t *pool, size_t size)
+{
+ void *p;
+ ngx_pool_large_t *large;
+
#if 0
p = ngx_memalign(ngx_pagesize, size, pool->log);
if (p == NULL) {
@@ -172,17 +212,6 @@ ngx_palloc(ngx_pool_t *pool, size_t size)
}
-void *
-ngx_palloc_aligned(ngx_pool_t *pool, size_t size)
-{
- if (size & 1) {
- size++;
- }
-
- return ngx_palloc(pool, size);
-}
-
-
ngx_int_t
ngx_pfree(ngx_pool_t *pool, void *p)
{