Mercurial > hg > nginx
diff src/http/modules/ngx_http_limit_zone_module.c @ 1743:4fc402c3ec73
optimize rbtree initialization and insert
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 17 Dec 2007 08:52:00 +0000 |
parents | 03341711f9a2 |
children | 7148efbdd798 |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_limit_zone_module.c Sun Dec 16 20:47:55 2007 +0000 +++ b/src/http/modules/ngx_http_limit_zone_module.c Mon Dec 17 08:52:00 2007 +0000 @@ -239,54 +239,36 @@ ngx_http_limit_zone_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) { - ngx_http_limit_zone_node_t *lzn, *lznt; + ngx_rbtree_node_t **p; + ngx_http_limit_zone_node_t *lzn, *lznt; for ( ;; ) { if (node->key < temp->key) { - if (temp->left == sentinel) { - temp->left = node; - break; - } - - temp = temp->left; + p = &temp->left; } else if (node->key > temp->key) { - if (temp->right == sentinel) { - temp->right = node; - break; - } - - temp = temp->right; + p = &temp->right; } else { /* node->key == temp->key */ lzn = (ngx_http_limit_zone_node_t *) &node->color; lznt = (ngx_http_limit_zone_node_t *) &temp->color; - if (ngx_memn2cmp(lzn->data, lznt->data, lzn->len, lznt->len) < 0) { - - if (temp->left == sentinel) { - temp->left = node; - break; - } - - temp = temp->left; + p = (ngx_memn2cmp(lzn->data, lznt->data, lzn->len, lznt->len) < 0) + ? &temp->left : &temp->right; + } - } else { + if (*p == sentinel) { + break; + } - if (temp->right == sentinel) { - temp->right = node; - break; - } - - temp = temp->right; - } - } + temp = *p; } + *p = node; node->parent = temp; node->left = sentinel; node->right = sentinel; @@ -362,11 +344,8 @@ return NGX_ERROR; } - ngx_rbtree_sentinel_init(sentinel); - - ctx->rbtree->root = sentinel; - ctx->rbtree->sentinel = sentinel; - ctx->rbtree->insert = ngx_http_limit_zone_rbtree_insert_value; + ngx_rbtree_init(ctx->rbtree, sentinel, + ngx_http_limit_zone_rbtree_insert_value); return NGX_OK; }