/** help mesh delete delete mesh states */
static void
-mesh_delete_helper(rbnode_t* n, void* ATTR_UNUSED(arg))
+mesh_delete_helper(rbnode_t* n)
{
struct mesh_state* mstate = (struct mesh_state*)n->key;
/* perform a full delete, not only 'cleanup' routine,
* because other callbacks expect a clean state in the mesh.
* For 're-entrant' calls */
mesh_state_delete(&mstate->s);
+ /* but because these delete the items from the tree, postorder
+ * traversal and rbtree rebalancing do not work together */
}
void
if(!mesh)
return;
/* free all query states */
- traverse_postorder(&mesh->all, &mesh_delete_helper, NULL);
+ while(mesh->all.count)
+ mesh_delete_helper(mesh->all.root);
timehist_delete(mesh->histogram);
free(mesh);
}
mesh_delete_all(struct mesh_area* mesh)
{
/* free all query states */
- traverse_postorder(&mesh->all, &mesh_delete_helper, NULL);
+ while(mesh->all.count)
+ mesh_delete_helper(mesh->all.root);
mesh->stats_dropped += mesh->num_reply_addrs;
/* clear mesh area references */
rbtree_init(&mesh->run, &mesh_state_compare);