[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