Mercurial > hg > nginx-vendor-current
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 } |