comparison src/core/ngx_radix_tree.c @ 694:88a1b4797f2e NGINX_1_3_10

nginx 1.3.10 *) Change: domain names specified in configuration file are now resolved to IPv6 addresses as well as IPv4 ones. *) Change: now if the "include" directive with mask is used on Unix systems, included files are sorted in alphabetical order. *) Change: the "add_header" directive adds headers to 201 responses. *) Feature: the "geo" directive now supports IPv6 addresses in CIDR notation. *) Feature: the "flush" and "gzip" parameters of the "access_log" directive. *) Feature: variables support in the "auth_basic" directive. *) Bugfix: nginx could not be built with the ngx_http_perl_module in some cases. *) Bugfix: a segmentation fault might occur in a worker process if the ngx_http_xslt_module was used. *) Bugfix: nginx could not be built on MacOSX in some cases. Thanks to Piotr Sikora. *) Bugfix: the "limit_rate" directive with high rates might result in truncated responses on 32-bit platforms. Thanks to Alexey Antropov. *) Bugfix: a segmentation fault might occur in a worker process if the "if" directive was used. Thanks to Piotr Sikora. *) Bugfix: a "100 Continue" response was issued with "413 Request Entity Too Large" responses. *) Bugfix: the "image_filter", "image_filter_jpeg_quality" and "image_filter_sharpen" directives might be inherited incorrectly. Thanks to Ian Babrou. *) Bugfix: "crypt_r() failed" errors might appear if the "auth_basic" directive was used on Linux. *) Bugfix: in backup servers handling. Thanks to Thomas Chen. *) Bugfix: proxied HEAD requests might return incorrect response if the "gzip" directive was used.
author Igor Sysoev <http://sysoev.ru>
date Tue, 25 Dec 2012 00:00:00 +0400
parents 660139fd80ca
children
comparison
equal deleted inserted replaced
693:cfd4279acc6e 694:88a1b4797f2e
7 7
8 #include <ngx_config.h> 8 #include <ngx_config.h>
9 #include <ngx_core.h> 9 #include <ngx_core.h>
10 10
11 11
12 static void *ngx_radix_alloc(ngx_radix_tree_t *tree); 12 static ngx_radix_node_t *ngx_radix_alloc(ngx_radix_tree_t *tree);
13 13
14 14
15 ngx_radix_tree_t * 15 ngx_radix_tree_t *
16 ngx_radix_tree_create(ngx_pool_t *pool, ngx_int_t preallocate) 16 ngx_radix_tree_create(ngx_pool_t *pool, ngx_int_t preallocate)
17 { 17 {
261 261
262 return value; 262 return value;
263 } 263 }
264 264
265 265
266 static void * 266 #if (NGX_HAVE_INET6)
267
268 ngx_int_t
269 ngx_radix128tree_insert(ngx_radix_tree_t *tree, u_char *key, u_char *mask,
270 uintptr_t value)
271 {
272 u_char bit;
273 ngx_uint_t i;
274 ngx_radix_node_t *node, *next;
275
276 i = 0;
277 bit = 0x80;
278
279 node = tree->root;
280 next = tree->root;
281
282 while (bit & mask[i]) {
283 if (key[i] & bit) {
284 next = node->right;
285
286 } else {
287 next = node->left;
288 }
289
290 if (next == NULL) {
291 break;
292 }
293
294 bit >>= 1;
295 node = next;
296
297 if (bit == 0) {
298 if (++i == 16) {
299 break;
300 }
301
302 bit = 0x80;
303 }
304 }
305
306 if (next) {
307 if (node->value != NGX_RADIX_NO_VALUE) {
308 return NGX_BUSY;
309 }
310
311 node->value = value;
312 return NGX_OK;
313 }
314
315 while (bit & mask[i]) {
316 next = ngx_radix_alloc(tree);
317 if (next == NULL) {
318 return NGX_ERROR;
319 }
320
321 next->right = NULL;
322 next->left = NULL;
323 next->parent = node;
324 next->value = NGX_RADIX_NO_VALUE;
325
326 if (key[i] & bit) {
327 node->right = next;
328
329 } else {
330 node->left = next;
331 }
332
333 bit >>= 1;
334 node = next;
335
336 if (bit == 0) {
337 if (++i == 16) {
338 break;
339 }
340
341 bit = 0x80;
342 }
343 }
344
345 node->value = value;
346
347 return NGX_OK;
348 }
349
350
351 ngx_int_t
352 ngx_radix128tree_delete(ngx_radix_tree_t *tree, u_char *key, u_char *mask)
353 {
354 u_char bit;
355 ngx_uint_t i;
356 ngx_radix_node_t *node;
357
358 i = 0;
359 bit = 0x80;
360 node = tree->root;
361
362 while (node && (bit & mask[i])) {
363 if (key[i] & bit) {
364 node = node->right;
365
366 } else {
367 node = node->left;
368 }
369
370 bit >>= 1;
371
372 if (bit == 0) {
373 if (++i == 16) {
374 break;
375 }
376
377 bit = 0x80;
378 }
379 }
380
381 if (node == NULL) {
382 return NGX_ERROR;
383 }
384
385 if (node->right || node->left) {
386 if (node->value != NGX_RADIX_NO_VALUE) {
387 node->value = NGX_RADIX_NO_VALUE;
388 return NGX_OK;
389 }
390
391 return NGX_ERROR;
392 }
393
394 for ( ;; ) {
395 if (node->parent->right == node) {
396 node->parent->right = NULL;
397
398 } else {
399 node->parent->left = NULL;
400 }
401
402 node->right = tree->free;
403 tree->free = node;
404
405 node = node->parent;
406
407 if (node->right || node->left) {
408 break;
409 }
410
411 if (node->value != NGX_RADIX_NO_VALUE) {
412 break;
413 }
414
415 if (node->parent == NULL) {
416 break;
417 }
418 }
419
420 return NGX_OK;
421 }
422
423
424 uintptr_t
425 ngx_radix128tree_find(ngx_radix_tree_t *tree, u_char *key)
426 {
427 u_char bit;
428 uintptr_t value;
429 ngx_uint_t i;
430 ngx_radix_node_t *node;
431
432 i = 0;
433 bit = 0x80;
434 value = NGX_RADIX_NO_VALUE;
435 node = tree->root;
436
437 while (node) {
438 if (node->value != NGX_RADIX_NO_VALUE) {
439 value = node->value;
440 }
441
442 if (key[i] & bit) {
443 node = node->right;
444
445 } else {
446 node = node->left;
447 }
448
449 bit >>= 1;
450
451 if (bit == 0) {
452 i++;
453 bit = 0x80;
454 }
455 }
456
457 return value;
458 }
459
460 #endif
461
462
463 static ngx_radix_node_t *
267 ngx_radix_alloc(ngx_radix_tree_t *tree) 464 ngx_radix_alloc(ngx_radix_tree_t *tree)
268 { 465 {
269 char *p; 466 ngx_radix_node_t *p;
270 467
271 if (tree->free) { 468 if (tree->free) {
272 p = (char *) tree->free; 469 p = tree->free;
273 tree->free = tree->free->right; 470 tree->free = tree->free->right;
274 return p; 471 return p;
275 } 472 }
276 473
277 if (tree->size < sizeof(ngx_radix_node_t)) { 474 if (tree->size < sizeof(ngx_radix_node_t)) {
281 } 478 }
282 479
283 tree->size = ngx_pagesize; 480 tree->size = ngx_pagesize;
284 } 481 }
285 482
286 p = tree->start; 483 p = (ngx_radix_node_t *) tree->start;
287 tree->start += sizeof(ngx_radix_node_t); 484 tree->start += sizeof(ngx_radix_node_t);
288 tree->size -= sizeof(ngx_radix_node_t); 485 tree->size -= sizeof(ngx_radix_node_t);
289 486
290 return p; 487 return p;
291 } 488 }