mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 06:25:31 +00:00
Add is_leaf and send_to_prune_tree.
Add is_leaf and send_to_prune_tree to make the logic easier to understand in cleanup_dead_nodes and decrement_reference.
This commit is contained in:
committed by
Ondřej Surý
parent
176b23b6cd
commit
c6efc0e50f
@@ -1824,6 +1824,31 @@ new_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*%
|
||||||
|
* The tree lock must be held for the result to be valid.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
is_leaf(dns_rbtnode_t *node) {
|
||||||
|
return (node->parent != NULL && node->parent->down == node &&
|
||||||
|
node->left == NULL && node->right == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
send_to_prune_tree(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node) {
|
||||||
|
isc_event_t *ev;
|
||||||
|
dns_db_t *db;
|
||||||
|
|
||||||
|
ev = isc_event_allocate(rbtdb->common.mctx, NULL,
|
||||||
|
DNS_EVENT_RBTPRUNE,
|
||||||
|
prune_tree, node,
|
||||||
|
sizeof(isc_event_t));
|
||||||
|
new_reference(rbtdb, node);
|
||||||
|
db = NULL;
|
||||||
|
attach((dns_db_t *)rbtdb, &db);
|
||||||
|
ev->ev_sender = db;
|
||||||
|
isc_task_send(rbtdb->task, &ev);
|
||||||
|
}
|
||||||
|
|
||||||
/*%
|
/*%
|
||||||
* Clean up dead nodes. These are nodes which have no references, and
|
* Clean up dead nodes. These are nodes which have no references, and
|
||||||
* have no data. They are dead but we could not or chose not to delete
|
* have no data. They are dead but we could not or chose not to delete
|
||||||
@@ -1852,22 +1877,8 @@ cleanup_dead_nodes(dns_rbtdb_t *rbtdb, int bucketnum) {
|
|||||||
INSIST(isc_refcount_current(&node->references) == 0 &&
|
INSIST(isc_refcount_current(&node->references) == 0 &&
|
||||||
node->data == NULL);
|
node->data == NULL);
|
||||||
|
|
||||||
if (node->parent != NULL &&
|
if (is_leaf(node) && rbtdb->task != NULL) {
|
||||||
node->parent->down == node && node->left == NULL &&
|
send_to_prune_tree(rbtdb, node);
|
||||||
node->right == NULL && rbtdb->task != NULL)
|
|
||||||
{
|
|
||||||
isc_event_t *ev;
|
|
||||||
dns_db_t *db;
|
|
||||||
|
|
||||||
ev = isc_event_allocate(rbtdb->common.mctx, NULL,
|
|
||||||
DNS_EVENT_RBTPRUNE,
|
|
||||||
prune_tree, node,
|
|
||||||
sizeof(isc_event_t));
|
|
||||||
new_reference(rbtdb, node);
|
|
||||||
db = NULL;
|
|
||||||
attach((dns_db_t *)rbtdb, &db);
|
|
||||||
ev->ev_sender = db;
|
|
||||||
isc_task_send(rbtdb->task, &ev);
|
|
||||||
} else if (node->down == NULL && node->data == NULL) {
|
} else if (node->down == NULL && node->data == NULL) {
|
||||||
/*
|
/*
|
||||||
* Not a interior node and not needing to be
|
* Not a interior node and not needing to be
|
||||||
@@ -2067,21 +2078,8 @@ decrement_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
|
|||||||
* it's their responsibility to purge stale leaves (e.g. by
|
* it's their responsibility to purge stale leaves (e.g. by
|
||||||
* periodic walk-through).
|
* periodic walk-through).
|
||||||
*/
|
*/
|
||||||
if (!pruning && node->parent != NULL &&
|
if (!pruning && is_leaf(node) && rbtdb->task != NULL) {
|
||||||
node->parent->down == node && node->left == NULL &&
|
send_to_prune_tree(rbtdb, node);
|
||||||
node->right == NULL && rbtdb->task != NULL) {
|
|
||||||
isc_event_t *ev;
|
|
||||||
dns_db_t *db;
|
|
||||||
|
|
||||||
ev = isc_event_allocate(rbtdb->common.mctx, NULL,
|
|
||||||
DNS_EVENT_RBTPRUNE,
|
|
||||||
prune_tree, node,
|
|
||||||
sizeof(isc_event_t));
|
|
||||||
new_reference(rbtdb, node);
|
|
||||||
db = NULL;
|
|
||||||
attach((dns_db_t *)rbtdb, &db);
|
|
||||||
ev->ev_sender = db;
|
|
||||||
isc_task_send(rbtdb->task, &ev);
|
|
||||||
no_reference = false;
|
no_reference = false;
|
||||||
} else {
|
} else {
|
||||||
delete_node(rbtdb, node);
|
delete_node(rbtdb, node);
|
||||||
|
Reference in New Issue
Block a user