[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