nginx源码剖析-红黑树ngx_rbtree_t(添加lookup操作)

前一篇转自他人的rbtree结构分析,但是前一篇只有init、insert、delete操作,没有介绍lookup操作。

所以在此添加lookup操作介绍。

依然借用nginx源码,源码文件名为ngx_resolver.c。

1. init操作:

ngx_rbtree_init(&r->addr_rbtree, &r->addr_sentinel,
                    ngx_rbtree_insert_value);

其中ngx_rbtree_insert_value是唯一值类型插入。

2.insert操作:

在接口ngx_int_t ngx_resolve_addr(ngx_resolver_ctx_t *ctx)中,调用ngx_rbtree_insert(tree, &rn->node);进行插入操作。

3.delete操作:

在接口static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)中,调用ngx_rbtree_delete(tree, &rn->node);进行删除操作。

4.lookup操作:

在接口ngx_int_t ngx_resolve_addr(ngx_resolver_ctx_t *ctx)中,调用ngx_resolver_lookup_addr完成lookup操作。

ngx_resolver_lookup_addr的源代码如下:

static ngx_resolver_node_t *

ngx_resolver_lookup_addr(ngx_resolver_t *r, in_addr_t addr)
{
    ngx_rbtree_node_t  *node, *sentinel;


    node = r->addr_rbtree.root;
    sentinel = r->addr_rbtree.sentinel;


    while (node != sentinel) {


        if (addr < node->key) {
            node = node->left;
            continue;
        }


        if (addr > node->key) {
            node = node->right;
            continue;
        }


        /* addr == node->key */


        return (ngx_resolver_node_t *) node;
    }


    /* not found */


    return NULL;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值