[Spice-devel] [PATCH spice-server v2 2/3] Fix removing a node

Frediano Ziglio fziglio at redhat.com
Wed Nov 16 11:35:06 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 | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/server/stat-file.c b/server/stat-file.c
index 7a07edb..54f5a1a 100644
--- a/server/stat-file.c
+++ b/server/stat-file.c
@@ -158,10 +158,32 @@ 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 */
+    /* childs 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;
+        }
+        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