]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
zone tree: optimize iteration by avioding fix_get()
authorLibor Peltan <libor.peltan@nic.cz>
Wed, 3 Jul 2019 16:10:30 +0000 (18:10 +0200)
committerLibor Peltan <libor.peltan@nic.cz>
Wed, 3 Jul 2019 16:10:30 +0000 (18:10 +0200)
src/knot/zone/zone-tree.c
src/knot/zone/zone-tree.h

index 9414bce07f013c49ac9b88b5bfee4819f5a52704..36af2e252b8af7d14a12756f53a4ebce40ab5675 100644 (file)
@@ -281,6 +281,7 @@ int zone_tree_it_begin(zone_tree_t *tree, zone_tree_it_t *it)
                        return KNOT_ENOMEM;
                }
                it->tree = tree;
+               it->binode_second = ((tree->flags & ZONE_TREE_BINO_SECOND) ? 1 : 0);
                it->next_tree = NULL;
        }
        return KNOT_EOK;
@@ -294,6 +295,7 @@ int zone_tree_it_double_begin(zone_tree_t *first, zone_tree_t *second, zone_tree
                        return KNOT_ENOMEM;
                }
                it->tree = first;
+               it->binode_second = ((first->flags & ZONE_TREE_BINO_SECOND) ? 1 : 0);
                it->next_tree = second;
        }
        return KNOT_EOK;
@@ -306,7 +308,7 @@ bool zone_tree_it_finished(zone_tree_it_t *it)
 
 zone_node_t *zone_tree_it_val(zone_tree_it_t *it)
 {
-       return fix_get(*trie_it_val(it->it), it->tree);
+       return (zone_node_t *)(*trie_it_val(it->it)) + it->binode_second;
 }
 
 void zone_tree_it_del(zone_tree_it_t *it)
@@ -320,6 +322,7 @@ void zone_tree_it_next(zone_tree_it_t *it)
        if (it->next_tree != NULL && trie_it_finished(it->it)) {
                trie_it_free(it->it);
                it->tree = it->next_tree;
+               it->binode_second = ((it->tree->flags & ZONE_TREE_BINO_SECOND) ? 1 : 0);
                it->next_tree = NULL;
                it->it = trie_it_begin(it->tree->trie);
        }
index 2b9ffc4eb5981f9eefcbf5614cb44e53cb61515c..394bf2586edbee3f6b31ae6ac02d4354f58d9764 100644 (file)
@@ -48,6 +48,7 @@ typedef int (*zone_tree_del_node_cb_t)(zone_node_t *node, void *ctx);
 typedef struct {
        zone_tree_t *tree;
        trie_it_t *it;
+       int binode_second;
 
        zone_tree_t *next_tree;
 } zone_tree_it_t;