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

Christophe Fergeau cfergeau at redhat.com
Wed Nov 16 15:13:47 UTC 2016


In the short log, I'd talk about "node removal" rather than "removing a
node"

On Wed, Nov 16, 2016 at 11:35:06AM +0000, Frediano Ziglio wrote:
> 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.

If I understand this correctly, the node was only invalidated, but was
not removed from the tree contrary to what "stat_file_remove" implies.
This means that the could then end up being reused, which would most
likely corrupt the tree, or something like that?

> 
> 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 */

'children' (famous mistake in libxml1 public API :)

Christophe
> +    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
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20161116/77df694d/attachment.sig>


More information about the Spice-devel mailing list