# HG changeset patch # User Mike Becker # Date 1708978560 -3600 # Node ID 8324037e01487ae52ddcf637d862d02c6c753b98 # Parent fceda550ebcb75ee9cb5245ab324cc2865a4dad5 use tree iterator to free scene nodes diff -r fceda550ebcb -r 8324037e0148 src/scene.c --- a/src/scene.c Thu Feb 22 22:34:50 2024 +0100 +++ b/src/scene.c Mon Feb 26 21:16:00 2024 +0100 @@ -75,20 +75,18 @@ void asc_scene_node_free(AscSceneNode *node) { if (node == NULL) return; - // TODO: replace with UCX tree visitor - // TODO: avoid recursion - - // free the children recursively - while (node->children != NULL) { - asc_scene_node_free(node->children); - } - // remove this node from its parent asc_scene_node_unlink(node); - // free the node - if (node->free_func != NULL) { - node->free_func(node); + // free the entire subtree + CxTreeIterator iter = cx_tree_iterator(node, true, child_list_off_); + cx_foreach(AscSceneNode*, child, iter) { + if (!iter.exiting) continue; + if (child->free_func != NULL) { + child->free_func(child); + } else { + free(child); + } } }