[Spice-devel] [PATCH spice-server v3 2/6] Fix node removal

Frediano Ziglio fziglio at redhat.com
Wed Nov 16 15:39:12 UTC 2016


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.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/stat-file.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/server/stat-file.c b/server/stat-file.c
index d688f80..7e35db0 100644
--- a/server/stat-file.c
+++ b/server/stat-file.c
@@ -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);
 }
 
-- 
2.7.4



More information about the Spice-devel mailing list