前一篇转自他人的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;
}