aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_radix_tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ngx_radix_tree.c')
-rw-r--r--src/core/ngx_radix_tree.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/src/core/ngx_radix_tree.c b/src/core/ngx_radix_tree.c
index c1d349e02..9493bab8a 100644
--- a/src/core/ngx_radix_tree.c
+++ b/src/core/ngx_radix_tree.c
@@ -8,7 +8,7 @@
#include <ngx_core.h>
-static void *ngx_radix_alloc(ngx_radix_tree_t *tree, size_t size);
+static void *ngx_radix_alloc(ngx_radix_tree_t *tree);
ngx_radix_tree_t *ngx_radix_tree_create(ngx_pool_t *pool)
@@ -24,14 +24,14 @@ ngx_radix_tree_t *ngx_radix_tree_create(ngx_pool_t *pool)
tree->start = NULL;
tree->size = 0;
- if (!(tree->root = ngx_radix_alloc(tree, sizeof(ngx_radix_node_t)))) {
+ if (!(tree->root = ngx_radix_alloc(tree))) {
return NULL;
}
- tree->root->value = (uintptr_t) 0;
tree->root->right = NULL;
tree->root->left = NULL;
tree->root->parent = NULL;
+ tree->root->value = NGX_RADIX_NO_VALUE;
return tree;
}
@@ -44,8 +44,9 @@ ngx_int_t ngx_radix32tree_insert(ngx_radix_tree_t *tree,
ngx_radix_node_t *node, *next;
bit = 0x80000000;
+
node = tree->root;
- next = NULL;
+ next = tree->root;
while (bit & mask) {
if (key & bit) {
@@ -55,17 +56,16 @@ ngx_int_t ngx_radix32tree_insert(ngx_radix_tree_t *tree,
next = node->left;
}
- bit >>= 1;
-
if (next == NULL) {
break;
}
+ bit >>= 1;
node = next;
}
if (next) {
- if (node->value) {
+ if (node->value != NGX_RADIX_NO_VALUE) {
return NGX_BUSY;
}
@@ -74,14 +74,14 @@ ngx_int_t ngx_radix32tree_insert(ngx_radix_tree_t *tree,
}
while (bit & mask) {
- if (!(next = ngx_radix_alloc(tree, sizeof(ngx_radix_node_t)))) {
+ if (!(next = ngx_radix_alloc(tree))) {
return NGX_ERROR;
}
- next->value = value;
next->right = NULL;
next->left = NULL;
next->parent = node;
+ next->value = NGX_RADIX_NO_VALUE;
if (key & bit) {
node->right = next;
@@ -94,6 +94,8 @@ ngx_int_t ngx_radix32tree_insert(ngx_radix_tree_t *tree,
node = next;
}
+ node->value = value;
+
return NGX_OK;
}
@@ -123,8 +125,12 @@ ngx_int_t ngx_radix32tree_delete(ngx_radix_tree_t *tree,
}
if (node->right || node->left) {
- node->value = (uintptr_t) 0;
- return NGX_OK;
+ if (node->value != NGX_RADIX_NO_VALUE) {
+ node->value = NGX_RADIX_NO_VALUE;
+ return NGX_OK;
+ }
+
+ return NGX_ERROR;
}
for ( ;; ) {
@@ -139,7 +145,11 @@ ngx_int_t ngx_radix32tree_delete(ngx_radix_tree_t *tree,
node = node->parent;
- if (node->right || node->left || node->value || node->parent == NULL) {
+ if (node->right
+ || node->left
+ || node->value != NGX_RADIX_NO_VALUE
+ || node->parent == NULL)
+ {
break;
}
}
@@ -155,11 +165,11 @@ uintptr_t ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key)
ngx_radix_node_t *node;
bit = 0x80000000;
- value = (uintptr_t) 0;
+ value = NGX_RADIX_NO_VALUE;
node = tree->root;
while (node) {
- if (node->value) {
+ if (node->value != NGX_RADIX_NO_VALUE) {
value = node->value;
}
@@ -177,7 +187,7 @@ uintptr_t ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key)
}
-static void *ngx_radix_alloc(ngx_radix_tree_t *tree, size_t size)
+static void *ngx_radix_alloc(ngx_radix_tree_t *tree)
{
char *p;
@@ -187,7 +197,7 @@ static void *ngx_radix_alloc(ngx_radix_tree_t *tree, size_t size)
return p;
}
- if (tree->size < size) {
+ if (tree->size < sizeof(ngx_radix_node_t)) {
if (!(tree->start = ngx_palloc(tree->pool, ngx_pagesize))) {
return NULL;
}
@@ -196,8 +206,8 @@ static void *ngx_radix_alloc(ngx_radix_tree_t *tree, size_t size)
}
p = tree->start;
- tree->start += size;
- tree->size -= size;
+ tree->start += sizeof(ngx_radix_node_t);
+ tree->size -= sizeof(ngx_radix_node_t);
return p;
}