changeset 341:41e552841296

nginx-0.0.3-2004-05-26-19:30:12 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 26 May 2004 15:30:12 +0000
parents 0bf903191ceb
children 0ee0642af5f1
files src/core/ngx_radix_tree.c src/core/ngx_radix_tree.h
diffstat 2 files changed, 30 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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;