comparison src/core/ngx_radix_tree.c @ 2368:62be1c4edfba radix_with_skip

remove parent from radix tree node to add skip field
author Igor Sysoev <igor@sysoev.ru>
date Wed, 03 Dec 2008 13:23:07 +0000
parents 3aa4fd0e7dc5
children 12e8e0045096
comparison
equal deleted inserted replaced
2367:6f76c9027e59 2368:62be1c4edfba
6 6
7 #include <ngx_config.h> 7 #include <ngx_config.h>
8 #include <ngx_core.h> 8 #include <ngx_core.h>
9 9
10 10
11 static ngx_int_t ngx_radix32tree_delete_node(ngx_radix_tree_t *tree,
12 uint32_t key, uint32_t mask, ngx_radix_node_t **pnode, uint32_t bit);
11 static void *ngx_radix_alloc(ngx_radix_tree_t *tree); 13 static void *ngx_radix_alloc(ngx_radix_tree_t *tree);
12 14
13 15
14 ngx_radix_tree_t * 16 ngx_radix_tree_t *
15 ngx_radix_tree_create(ngx_pool_t *pool, ngx_int_t preallocate) 17 ngx_radix_tree_create(ngx_pool_t *pool, ngx_int_t preallocate)
32 return NULL; 34 return NULL;
33 } 35 }
34 36
35 tree->root->right = NULL; 37 tree->root->right = NULL;
36 tree->root->left = NULL; 38 tree->root->left = NULL;
37 tree->root->parent = NULL; 39 tree->root->skip = 0;
38 tree->root->value = NGX_RADIX_NO_VALUE; 40 tree->root->value = NGX_RADIX_NO_VALUE;
39 41
40 if (preallocate == 0) { 42 if (preallocate == 0) {
41 return tree; 43 return tree;
42 } 44 }
147 return NGX_ERROR; 149 return NGX_ERROR;
148 } 150 }
149 151
150 next->right = NULL; 152 next->right = NULL;
151 next->left = NULL; 153 next->left = NULL;
152 next->parent = node; 154 next->skip = 0;
153 next->value = NGX_RADIX_NO_VALUE; 155 next->value = NGX_RADIX_NO_VALUE;
154 156
155 if (key & bit) { 157 if (key & bit) {
156 node->right = next; 158 node->right = next;
157 159
170 172
171 173
172 ngx_int_t 174 ngx_int_t
173 ngx_radix32tree_delete(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask) 175 ngx_radix32tree_delete(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask)
174 { 176 {
175 uint32_t bit; 177 return ngx_radix32tree_delete_node(tree, key, mask, &tree->root,
178 0x80000000);
179 }
180
181
182 static ngx_int_t
183 ngx_radix32tree_delete_node(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask,
184 ngx_radix_node_t **pnode, uint32_t bit)
185 {
176 ngx_radix_node_t *node; 186 ngx_radix_node_t *node;
177 187
178 bit = 0x80000000; 188 node = *pnode;
179 node = tree->root;
180
181 while (node && (bit & mask)) {
182 if (key & bit) {
183 node = node->right;
184
185 } else {
186 node = node->left;
187 }
188
189 bit >>= 1;
190 }
191 189
192 if (node == NULL) { 190 if (node == NULL) {
193 return NGX_ERROR; 191 return NGX_ERROR;
194 } 192 }
195 193
194 if ((bit & mask) == 0) {
195
196 if (node->right || node->left) {
197
198 if (node->value != NGX_RADIX_NO_VALUE) {
199 node->value = NGX_RADIX_NO_VALUE;
200 return NGX_OK;
201 }
202
203 return NGX_ERROR;
204
205 } else {
206 node->right = tree->free;
207 tree->free = node;
208
209 *pnode = NULL;
210 }
211
212 return NGX_OK;
213 }
214
215 if (ngx_radix32tree_delete_node(tree, key, mask,
216 (key & bit) ? &node->right : &node->left,
217 bit >> 1)
218 != NGX_OK)
219 {
220 return NGX_ERROR;
221 }
222
196 if (node->right || node->left) { 223 if (node->right || node->left) {
197 if (node->value != NGX_RADIX_NO_VALUE) { 224 return NGX_OK;
198 node->value = NGX_RADIX_NO_VALUE; 225 }
199 return NGX_OK; 226
200 } 227 if (node->value != NGX_RADIX_NO_VALUE) {
201 228 return NGX_OK;
202 return NGX_ERROR; 229 }
203 } 230
204 231 node->right = tree->free;
205 for ( ;; ) { 232 tree->free = node;
206 if (node->parent->right == node) { 233
207 node->parent->right = NULL; 234 *pnode = NULL;
208
209 } else {
210 node->parent->left = NULL;
211 }
212
213 node->right = tree->free;
214 tree->free = node;
215
216 node = node->parent;
217
218 if (node->right || node->left) {
219 break;
220 }
221
222 if (node->value != NGX_RADIX_NO_VALUE) {
223 break;
224 }
225
226 if (node->parent == NULL) {
227 break;
228 }
229 }
230 235
231 return NGX_OK; 236 return NGX_OK;
232 } 237 }
233 238
234 239