#! /bin/sh /usr/share/dpatch/dpatch-run ## ngx_prealloc.dpatch by Kirill A. Korinskiy ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: Implement ngx_prealloc @DPATCH@ diff -r f7e9ab8042e2 src/core/ngx_palloc.c --- a/src/core/ngx_palloc.c Fri Jul 04 14:54:09 2008 +0400 +++ b/src/core/ngx_palloc.c Fri Jul 04 15:37:10 2008 +0400 @@ -254,6 +254,31 @@ return p; } +void * +ngx_prealloc(ngx_pool_t *pool, void *ptr, size_t old_size, size_t new_size) +{ + void *new; + if ((u_char*) ptr + old_size == pool->d.last && + pool->d.last + new_size <= pool->d.end) { + + /* + * the str allocation is last in the pool + * and there is space for new len + */ + + pool->d.last += new_size; + return ptr; + } + + new = ngx_palloc(pool, new_size); + if (new == NULL) { + return NULL; + } + + ngx_memcpy((u_char*)new, (u_char*)ptr, old_size); + + return new; +} ngx_pool_cleanup_t * ngx_pool_cleanup_add(ngx_pool_t *p, size_t size) diff -r f7e9ab8042e2 src/core/ngx_palloc.h --- a/src/core/ngx_palloc.h Fri Jul 04 14:54:09 2008 +0400 +++ b/src/core/ngx_palloc.h Fri Jul 04 15:37:10 2008 +0400 @@ -70,6 +70,7 @@ void *ngx_alloc(size_t size, ngx_log_t *log); void *ngx_calloc(size_t size, ngx_log_t *log); +void *ngx_prealloc(ngx_pool_t *pool, void *ptr, size_t old_size, size_t new_zie); ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log); void ngx_destroy_pool(ngx_pool_t *pool);