Index: sys/gnu/gcov/gcov_fs.c =================================================================== --- sys/gnu/gcov/gcov_fs.c (revision 350670) +++ sys/gnu/gcov/gcov_fs.c (working copy) @@ -185,6 +185,7 @@ * @entry: list entry for parent's child node list * @children: child nodes * @all_entry: list entry for list of all nodes + * @remove_entry: tail queue entry for marked to be removed nodes * @parent: parent node * @loaded_info: array of pointers to profiling data sets for loaded object * files. @@ -203,6 +204,7 @@ struct gcov_node { LIST_ENTRY(gcov_node) children_entry; LIST_ENTRY(gcov_node) all_entry; + TAILQ_ENTRY(gcov_node) remove_entry; struct { struct gcov_node *lh_first; } children; @@ -420,18 +422,22 @@ void gcov_stats_reset(void) { - struct gcov_node *node; + struct gcov_node *node, *node_temp; + TAILQ_HEAD(, gcov_node) remove_head = + TAILQ_HEAD_INITIALIZER(remove_head); mtx_lock(&node_lock); - restart: LIST_FOREACH(node, &all_head, all_entry) { if (node->num_loaded > 0) reset_node(node); else if (LIST_EMPTY(&node->children)) { - remove_node(node); - goto restart; + TAILQ_INSERT_TAIL(&remove_head, node, remove_entry); } } + + TAILQ_FOREACH_SAFE(node, &remove_head, remove_entry, node_temp) { + remove_node(node); + } mtx_unlock(&node_lock); }