Mercurial > hg > nginx-vendor-0-7
annotate src/core/ngx_rbtree.h @ 366:babd3d9efb62 NGINX_0_6_27
nginx 0.6.27
*) Change: now by default the rtsig method is not built on
Linux 2.6.18+.
*) Change: now a request method is not changed while redirection to a
named location via an "error_page" directive.
*) Feature: the "resolver" and "resolver_timeout" directives in SMTP
proxy.
*) Feature: the "post_action" directive supports named locations.
*) Bugfix: a segmentation fault occurred in worker process, if a
request was redirected from proxy, FastCGI, or memcached location to
static named locations.
*) Bugfix: browsers did not repeat SSL handshake if there is no valid
client certificate in first handshake.
Thanks to Alexander V. Inyukhin.
*) Bugfix: if response code 495-497 was redirected via an "error_page"
directive without code change, then nginx tried to allocate too many
memory.
*) Bugfix: memory leak in long-lived non buffered connections.
*) Bugfix: memory leak in resolver.
*) Bugfix: a segmentation fault occurred in worker process, if a
request was redirected from proxy, FastCGI, or memcached location to
static named locations.
*) Bugfix: in the $proxy_host and $proxy_port variables caching.
Thanks to Sergey Bochenkov.
*) Bugfix: a "proxy_pass" directive with variables used incorrectly the
same port as in another "proxy_pass" directive with the same host
name and without variables.
Thanks to Sergey Bochenkov.
*) Bugfix: an alert "sendmsg() failed (9: Bad file descriptor)" on some
64-bit platforms while reconfiguration.
*) Bugfix: a segmentation fault occurred in worker process, if empty
stub block was used second time in SSI.
*) Bugfix: in copying URI part contained escaped symbols into arguments.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 12 Mar 2008 00:00:00 +0300 |
parents | 583decdb82a4 |
children |
rev | line source |
---|---|
0 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #ifndef _NGX_RBTREE_H_INCLUDED_ | |
8 #define _NGX_RBTREE_H_INCLUDED_ | |
9 | |
10 | |
11 #include <ngx_config.h> | |
12 #include <ngx_core.h> | |
13 | |
14 | |
106 | 15 typedef ngx_uint_t ngx_rbtree_key_t; |
16 typedef ngx_int_t ngx_rbtree_key_int_t; | |
17 | |
18 | |
108 | 19 typedef struct ngx_rbtree_node_s ngx_rbtree_node_t; |
0 | 20 |
108 | 21 struct ngx_rbtree_node_s { |
22 ngx_rbtree_key_t key; | |
23 ngx_rbtree_node_t *left; | |
24 ngx_rbtree_node_t *right; | |
25 ngx_rbtree_node_t *parent; | |
258 | 26 u_char color; |
27 u_char data; | |
0 | 28 }; |
29 | |
30 | |
108 | 31 typedef struct ngx_rbtree_s ngx_rbtree_t; |
32 | |
258 | 33 typedef void (*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root, |
108 | 34 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); |
35 | |
36 struct ngx_rbtree_s { | |
37 ngx_rbtree_node_t *root; | |
38 ngx_rbtree_node_t *sentinel; | |
258 | 39 ngx_rbtree_insert_pt insert; |
108 | 40 }; |
0 | 41 |
42 | |
354 | 43 #define ngx_rbtree_init(tree, s, i) \ |
44 ngx_rbtree_sentinel_init(s); \ | |
45 (tree)->root = s; \ | |
46 (tree)->sentinel = s; \ | |
47 (tree)->insert = i | |
48 | |
49 | |
108 | 50 void ngx_rbtree_insert(ngx_thread_volatile ngx_rbtree_t *tree, |
51 ngx_rbtree_node_t *node); | |
52 void ngx_rbtree_delete(ngx_thread_volatile ngx_rbtree_t *tree, | |
53 ngx_rbtree_node_t *node); | |
258 | 54 void ngx_rbtree_insert_value(ngx_rbtree_node_t *root, ngx_rbtree_node_t *node, |
55 ngx_rbtree_node_t *sentinel); | |
56 void ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *root, | |
57 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); | |
108 | 58 |
59 | |
274 | 60 #define ngx_rbt_red(node) ((node)->color = 1) |
61 #define ngx_rbt_black(node) ((node)->color = 0) | |
62 #define ngx_rbt_is_red(node) ((node)->color) | |
63 #define ngx_rbt_is_black(node) (!ngx_rbt_is_red(node)) | |
64 #define ngx_rbt_copy_color(n1, n2) (n1->color = n2->color) | |
65 | |
66 | |
272 | 67 /* a sentinel must be black */ |
68 | |
274 | 69 #define ngx_rbtree_sentinel_init(node) ngx_rbt_black(node) |
272 | 70 |
71 | |
108 | 72 static ngx_inline ngx_rbtree_node_t * |
73 ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) | |
0 | 74 { |
106 | 75 while (node->left != sentinel) { |
76 node = node->left; | |
77 } | |
0 | 78 |
106 | 79 return node; |
0 | 80 } |
81 | |
82 | |
83 #endif /* _NGX_RBTREE_H_INCLUDED_ */ |