# HG changeset patch # User Igor Sysoev # Date 1085585412 0 # Node ID 41e552841296e6abdee78732ba7acfffb11ecc8e # Parent 0bf903191ceba94b174c2a61094407126b248d40 nginx-0.0.3-2004-05-26-19:30:12 import diff --git a/src/core/ngx_radix_tree.c b/src/core/ngx_radix_tree.c --- a/src/core/ngx_radix_tree.c +++ b/src/core/ngx_radix_tree.c @@ -21,6 +21,7 @@ ngx_radix_tree_t *ngx_radix_tree_create( tree->root = NULL; tree->pool = pool; tree->free = NULL; + tree->start = NULL; tree->size = 0; return tree; @@ -62,6 +63,8 @@ ngx_int_t ngx_radix32tree_insert(ngx_rad } new->value = value; + new->right = NULL; + new->left = NULL; if (key & bit) { node->right = new; @@ -81,16 +84,19 @@ ngx_int_t ngx_radix32tree_insert(ngx_rad void ngx_radix32tree_delete(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask) { uint32_t bit; - ngx_radix_node_t *node; + ngx_radix_node_t *node, **prev; bit = 0x80000000; node = tree->root; + prev = NULL; while (node && (bit & mask)) { if (key & bit) { + prev = &node->right;; node = node->right; } else { + prev = &node->left;; node = node->left; } @@ -98,7 +104,17 @@ void ngx_radix32tree_delete(ngx_radix_tr } if (node) { - node->value = (uintptr_t) 0; + + /* the leaf nodes are moved to the free list only */ + + if (node->right == NULL && node->left == NULL) { + *prev = NULL; + node->right = tree->free; + tree->free = node; + + } else { + node->value = (uintptr_t) 0; + } } } @@ -110,7 +126,7 @@ uintptr_t ngx_radix32tree_find(ngx_radix ngx_radix_node_t *node; bit = 0x80000000; - value = NULL; + value = (uintptr_t) 0; node = tree->root; while (node) { @@ -136,16 +152,22 @@ static void *ngx_radix_alloc(ngx_radix_t { char *p; + if (tree->free) { + p = (char *) tree->free; + tree->free = tree->free->right; + return p; + } + if (tree->size < size) { - if (!(tree->free = ngx_palloc(tree->pool, NGX_RADIX_TREE_POOL_SIZE))) { + if (!(tree->start = ngx_palloc(tree->pool, NGX_RADIX_TREE_POOL_SIZE))) { return NULL; } tree->size = NGX_RADIX_TREE_POOL_SIZE; } - p = tree->free; - tree->free += size; + p = tree->start; + tree->start += size; tree->size -= size; return p; diff --git a/src/core/ngx_radix_tree.h b/src/core/ngx_radix_tree.h --- a/src/core/ngx_radix_tree.h +++ b/src/core/ngx_radix_tree.h @@ -18,7 +18,8 @@ struct ngx_radix_node_s { typedef struct { ngx_radix_node_t *root; ngx_pool_t *pool; - char *free; + ngx_radix_node_t *free; + char *start; size_t size; } ngx_radix_tree_t;