return r;
}
-static int loc_network_tree_delete_node(struct loc_network_tree_node** node) {
+static int loc_network_tree_delete_node(struct loc_network_tree* tree,
+ struct loc_network_tree_node** node) {
struct loc_network_tree_node* n = *node;
int r0 = 1;
int r1 = 1;
// Delete zero
if (n->zero) {
- r0 = loc_network_tree_delete_node(&n->zero);
+ r0 = loc_network_tree_delete_node(tree, &n->zero);
if (r0 < 0)
return r0;
}
// Delete one
if (n->one) {
- r1 = loc_network_tree_delete_node(&n->one);
+ r1 = loc_network_tree_delete_node(tree, &n->one);
if (r1 < 0)
return r1;
}
if (!r0 || !r1)
return 0;
+ // Don't delete root
+ if (tree->root == n)
+ return 0;
+
DELETE:
// It is now safe to delete the node
loc_network_tree_node_unref(n);
static int loc_network_tree_delete_nodes(struct loc_network_tree* tree) {
int r;
- r = loc_network_tree_delete_node(&tree->root);
+ r = loc_network_tree_delete_node(tree, &tree->root);
if (r < 0)
return r;
- // Undelete the root node in case the entire tree got deleted
- tree->root->deleted = 0;
-
return 0;
}