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

本文深入分析了rbtree结构的init、insert、delete及lookup操作,通过引用nginx源码ngx_resolver.c进行具体实现解析。重点介绍了init初始化、insert插入、delete删除操作和lookup查找操作的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一篇转自他人的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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值