annotate src/core/ngx_radix_tree.c @ 196:8759b346e431 NGINX_0_3_45

nginx 0.3.45 *) Feature: the "ssl_verify_client", "ssl_verify_depth", and "ssl_client_certificate" directives. *) Change: the $request_method variable now returns the main request method. *) Change: the ° symbol codes were changed in koi-win conversion table. *) Feature: the euro и N symbols were added to koi-win conversion table. *) Bugfix: if nginx distributed the requests among several backends and some backend failed, then requests intended for this backend was directed to one live backend only instead of being distributed among the rest.
author Igor Sysoev <http://sysoev.ru>
date Sat, 06 May 2006 00:00:00 +0400
parents 408f195b3482
children f745bf973510
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11 static void *ngx_radix_alloc(ngx_radix_tree_t *tree);
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
14 ngx_radix_tree_t *
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
15 ngx_radix_tree_create(ngx_pool_t *pool, ngx_int_t preallocate)
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 {
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
17 uint32_t key, mask, inc;
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 ngx_radix_tree_t *tree;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
20 tree = ngx_palloc(pool, sizeof(ngx_radix_tree_t));
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
21 if (tree == NULL) {
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 return NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 tree->pool = pool;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 tree->free = NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 tree->start = NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 tree->size = 0;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
30 tree->root = ngx_radix_alloc(tree);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
31 if (tree->root == NULL) {
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 return NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 tree->root->right = NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 tree->root->left = NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 tree->root->parent = NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 tree->root->value = NGX_RADIX_NO_VALUE;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
40 if (preallocate == 0) {
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
41 return tree;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
42 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
43
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
44 /*
42
41ccba1aba45 nginx 0.1.21
Igor Sysoev <http://sysoev.ru>
parents: 38
diff changeset
45 * The preallocation the first nodes: 0, 1, 00, 01, 10, 11, 000, 001, etc.
41ccba1aba45 nginx 0.1.21
Igor Sysoev <http://sysoev.ru>
parents: 38
diff changeset
46 * increases the TLB hits even if for the first lookup iterations.
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
47 * On the 32-bit platforms the 7 preallocated bits takes continuous 4K,
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
48 * 8 - 8K, 9 - 16K, etc. On the 64-bit platforms the 6 preallocated bits
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
49 * takes continuous 4K, 7 - 8K, 8 - 16K, etc. There is no sense to
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
50 * to preallocate more than one page, because further preallocation
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 42
diff changeset
51 * distributes the only bit per page. Instead, the random insertion
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
52 * may distribute several bits per page.
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
53 *
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
54 * Thus, by default we preallocate maximum
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
55 * 6 bits on amd64 (64-bit platform and 4K pages)
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
56 * 7 bits on i386 (32-bit platform and 4K pages)
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
57 * 7 bits on sparc64 in 64-bit mode (8K pages)
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
58 * 8 bits on sparc64 in 32-bit mode (8K pages)
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
59 */
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
60
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
61 if (preallocate == -1) {
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
62 switch (ngx_pagesize / sizeof(ngx_radix_tree_t)) {
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
63
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
64 /* amd64 */
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
65 case 128:
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
66 preallocate = 6;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
67 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
68
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
69 /* i386, sparc64 */
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
70 case 256:
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
71 preallocate = 7;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
72 break;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
73
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
74 /* sparc64 in 32-bit mode */
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
75 default:
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
76 preallocate = 8;
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
77 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
78 }
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
79
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
80 mask = 0;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
81 inc = 0x80000000;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
82
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
83 while (preallocate--) {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
84
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
85 key = 0;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
86 mask >>= 1;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
87 mask |= 0x80000000;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
88
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
89 do {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
90 if (ngx_radix32tree_insert(tree, key, mask, NGX_RADIX_NO_VALUE)
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
91 != NGX_OK)
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
92 {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
93 return NULL;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
94 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
95
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
96 key += inc;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
97
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
98 } while (key);
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
99
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
100 inc >>= 1;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
101 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
102
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 return tree;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
107 ngx_int_t
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
108 ngx_radix32tree_insert(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask,
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
109 uintptr_t value)
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 uint32_t bit;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 ngx_radix_node_t *node, *next;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 bit = 0x80000000;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 node = tree->root;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 next = tree->root;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 while (bit & mask) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 if (key & bit) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121 next = node->right;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 } else {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 next = node->left;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 if (next == NULL) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 break;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 bit >>= 1;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 node = next;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 if (next) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136 if (node->value != NGX_RADIX_NO_VALUE) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 return NGX_BUSY;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 node->value = value;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 return NGX_OK;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144 while (bit & mask) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
145 next = ngx_radix_alloc(tree);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
146 if (next == NULL) {
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 return NGX_ERROR;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150 next->right = NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151 next->left = NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 next->parent = node;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 next->value = NGX_RADIX_NO_VALUE;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 if (key & bit) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 node->right = next;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 } else {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 node->left = next;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162 bit >>= 1;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 node = next;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 node->value = value;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 return NGX_OK;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
172 ngx_int_t
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
173 ngx_radix32tree_delete(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask)
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 uint32_t bit;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 ngx_radix_node_t *node;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 bit = 0x80000000;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 node = tree->root;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 while (node && (bit & mask)) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182 if (key & bit) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 node = node->right;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185 } else {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 node = node->left;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 bit >>= 1;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 if (node == NULL) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 return NGX_ERROR;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 if (node->right || node->left) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 if (node->value != NGX_RADIX_NO_VALUE) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 node->value = NGX_RADIX_NO_VALUE;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 return NGX_OK;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202 return NGX_ERROR;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 for ( ;; ) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206 if (node->parent->right == node) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 node->parent->right = NULL;
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
208
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 } else {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 node->parent->left = NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213 node->right = tree->free;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214 tree->free = node;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216 node = node->parent;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
218 if (node->right || node->left) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
219 break;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
220 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
221
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
222 if (node->value != NGX_RADIX_NO_VALUE) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
223 break;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
224 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
225
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
226 if (node->parent == NULL) {
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 break;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 return NGX_OK;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
235 uintptr_t
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
236 ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key)
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237 {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 uint32_t bit;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239 uintptr_t value;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 ngx_radix_node_t *node;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 bit = 0x80000000;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243 value = NGX_RADIX_NO_VALUE;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 node = tree->root;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 while (node) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 if (node->value != NGX_RADIX_NO_VALUE) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 value = node->value;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 if (key & bit) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 node = node->right;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 } else {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 node = node->left;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 bit >>= 1;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 return value;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
265 static void *
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
266 ngx_radix_alloc(ngx_radix_tree_t *tree)
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268 char *p;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 if (tree->free) {
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 p = (char *) tree->free;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272 tree->free = tree->free->right;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
273 return p;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276 if (tree->size < sizeof(ngx_radix_node_t)) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
277 tree->start = ngx_palloc(tree->pool, ngx_pagesize);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
278 if (tree->start == NULL) {
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279 return NULL;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
280 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282 tree->size = ngx_pagesize;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283 }
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285 p = tree->start;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286 tree->start += sizeof(ngx_radix_node_t);
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287 tree->size -= sizeof(ngx_radix_node_t);
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 return p;
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290 }