[Spice-devel] [PATCH 06/11] worker: move some tree container functions
Fabiano FidĂȘncio
fidencio at redhat.com
Wed Nov 11 06:32:08 PST 2015
On Wed, Nov 11, 2015 at 1:20 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
>
> ---
> server/red_worker.c | 32 ++++----------------------------
> server/tree.c | 27 +++++++++++++++++++++++++++
> server/tree.h | 2 ++
> 3 files changed, 33 insertions(+), 28 deletions(-)
>
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 5cdb348..e82317c 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -933,30 +933,6 @@ static inline void remove_shadow(DrawItem *item)
> free(shadow);
> }
>
> -static inline void current_remove_container(DisplayChannel *display, Container *container)
> -{
> - spice_assert(ring_is_empty(&container->items));
> - ring_remove(&container->base.siblings_link);
> - region_destroy(&container->base.rgn);
> - free(container);
> -}
> -
> -static inline void container_cleanup(DisplayChannel *display, Container *container)
> -{
> - while (container && container->items.next == container->items.prev) {
> - Container *next = container->base.container;
> - if (container->items.next != &container->items) {
> - TreeItem *item = (TreeItem *)ring_get_head(&container->items);
> - spice_assert(item);
> - ring_remove(&item->siblings_link);
> - ring_add_after(&item->siblings_link, &container->base.siblings_link);
> - item->container = container->base.container;
> - }
> - current_remove_container(display, container);
> - container = next;
> - }
> -}
> -
> static void display_stream_trace_add_drawable(DisplayChannel *display, Drawable *item)
> {
> ItemTrace *trace;
> @@ -1034,7 +1010,7 @@ static inline void current_remove(DisplayChannel *display, TreeItem *item)
> continue;
> }
> ring_item = now->siblings_link.prev;
> - current_remove_container(display, container);
> + container_free(container);
> }
> if (now == item) {
> return;
> @@ -2613,7 +2589,7 @@ static bool free_one_drawable(DisplayChannel *display, int force_glz_free)
> container = drawable->tree_item.base.container;
>
> current_remove_drawable(display, drawable);
> - container_cleanup(display, container);
> + container_cleanup(container);
> return TRUE;
> }
>
> @@ -3106,7 +3082,7 @@ static void red_update_area_till(DisplayChannel *display, const SpiceRect *area,
> now->refs++;
> container = now->tree_item.base.container;
> current_remove_drawable(display, now);
> - container_cleanup(display, container);
> + container_cleanup(container);
> /* red_draw_drawable may call red_update_area for the surfaces 'now' depends on. Notice,
> that it is valid to call red_update_area in this case and not red_update_area_till:
> It is impossible that there was newer item then 'last' in one of the surfaces
> @@ -3164,7 +3140,7 @@ static void red_update_area(DisplayChannel *display, const SpiceRect *area, int
> now->refs++;
> container = now->tree_item.base.container;
> current_remove_drawable(display, now);
> - container_cleanup(display, container);
> + container_cleanup(container);
> red_draw_drawable(display, now);
> display_channel_drawable_unref(display, now);
> } while (now != last);
> diff --git a/server/tree.c b/server/tree.c
> index bf50edf..ad31f09 100644
> --- a/server/tree.c
> +++ b/server/tree.c
> @@ -223,3 +223,30 @@ Container* container_new(DrawItem *item)
>
> return container;
> }
> +
> +void container_free(Container *container)
> +{
Better add a check if container is valid as well.
> + spice_return_if_fail(ring_is_empty(&container->items));
> +
> + ring_remove(&container->base.siblings_link);
> + region_destroy(&container->base.rgn);
> + free(container);
> +}
> +
> +void container_cleanup(Container *container)
> +{
> + /* visit upward, removing containers */
> + /* non-empty container get its element moving up ?? */
> + while (container && container->items.next == container->items.prev) {
> + Container *next = container->base.container;
> + if (container->items.next != &container->items) {
> + TreeItem *item = (TreeItem *)ring_get_head(&container->items);
> + spice_assert(item);
> + ring_remove(&item->siblings_link);
> + ring_add_after(&item->siblings_link, &container->base.siblings_link);
> + item->container = container->base.container;
> + }
> + container_free(container);
> + container = next;
> + }
> +}
> diff --git a/server/tree.h b/server/tree.h
> index 6249c28..01d4ff9 100644
> --- a/server/tree.h
> +++ b/server/tree.h
> @@ -82,5 +82,7 @@ static inline int is_opaque_item(TreeItem *item)
> void tree_item_dump (TreeItem *item);
> Shadow* shadow_new (DrawItem *item, const SpicePoint *delta);
> Container* container_new (DrawItem *item);
> +void container_free (Container *container);
> +void container_cleanup (Container *container);
>
> #endif /* TREE_H_ */
> --
> 2.4.3
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
ACK!
More information about the Spice-devel
mailing list