mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-15 05:10:11 +00:00
Fix node removal
Avoid to produce loop in the tree removing and adding nodes. Unlink the node from the containing tree. This possibly will create unlinked trees if a parent node is deleted. What was happening is that the creation of loops inside the tree caused some statistical function to go into an infinite loop (and reds_stat tool too). Nodes were only invalidated but still linked so when reused the new node could point to an already existing node (like a sibling) which pointed to the new reused one. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
This commit is contained in:
parent
f9ccabfaea
commit
fe543c6b45
@ -159,10 +159,35 @@ stat_file_add_counter(RedStatFile *stat_file, StatNodeRef parent, const char *na
|
||||
|
||||
static void stat_file_remove(RedStatFile *stat_file, SpiceStatNode *node)
|
||||
{
|
||||
const StatNodeRef node_ref = node - stat_file->stat->nodes;
|
||||
const StatNodeRef node_next = node->next_sibling_index;
|
||||
StatNodeRef ref;
|
||||
|
||||
pthread_mutex_lock(&stat_file->lock);
|
||||
node->flags &= ~SPICE_STAT_NODE_FLAG_ENABLED;
|
||||
stat_file->stat->generation++;
|
||||
stat_file->stat->num_of_nodes--;
|
||||
/* remove links from parent or siblings */
|
||||
/* children will be orphans */
|
||||
if (stat_file->stat->root_index == node_ref) {
|
||||
stat_file->stat->root_index = node_next;
|
||||
} else for (ref = 0; ref <= stat_file->max_nodes; ref++) {
|
||||
node = &stat_file->stat->nodes[ref];
|
||||
if (!(node->flags & SPICE_STAT_NODE_FLAG_ENABLED)) {
|
||||
continue;
|
||||
}
|
||||
/* in a tree there is only a link from a parent or
|
||||
* previous sibling so we can exit the loop as
|
||||
* soon as we found on link */
|
||||
if (node->first_child_index == node_ref) {
|
||||
node->first_child_index = node_next;
|
||||
break;
|
||||
}
|
||||
if (node->next_sibling_index == node_ref) {
|
||||
node->next_sibling_index = node_next;
|
||||
break;
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&stat_file->lock);
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user