[Spice-devel] [PATCH 15/19] worker: move current_remove*

Fabiano Fidêncio fidencio at redhat.com
Thu Nov 26 01:52:40 PST 2015


On Wed, Nov 25, 2015 at 4:27 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
>
> ---
>  server/display-channel.c | 61 ++++++++++++++++++++++++++++++++++++
>  server/display-channel.h |  3 --
>  server/red_worker.c      | 80 ------------------------------------------------
>  server/stream.c          | 19 ++++++++++++
>  server/stream.h          |  2 ++
>  5 files changed, 82 insertions(+), 83 deletions(-)
>
> diff --git a/server/display-channel.c b/server/display-channel.c
> index ded306b..aa3e7fb 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -391,6 +391,67 @@ static void current_add_drawable(DisplayChannel *display,
>      drawable->refs++;
>  }
>
> +static void current_remove_drawable(DisplayChannel *display, Drawable *item)
> +{
> +    /* todo: move all to unref? */
> +    stream_trace_add_drawable(display, item);
> +    draw_item_remove_shadow(&item->tree_item);
> +    ring_remove(&item->tree_item.base.siblings_link);
> +    ring_remove(&item->list_link);
> +    ring_remove(&item->surface_list_link);
> +    display_channel_drawable_unref(display, item);
> +    display->current_size--;
> +}
> +
> +static void current_remove(DisplayChannel *display, TreeItem *item)
> +{
> +    TreeItem *now = item;
> +
> +    /* depth-first tree traversal, TODO: do a to tree_foreach()? */
> +    for (;;) {
> +        Container *container = now->container;
> +        RingItem *ring_item;
> +
> +        if (now->type == TREE_ITEM_TYPE_DRAWABLE) {
> +            Drawable *drawable = SPICE_CONTAINEROF(now, Drawable, tree_item);
> +            ring_item = now->siblings_link.prev;
> +            red_pipes_remove_drawable(drawable);
> +            current_remove_drawable(display, drawable);
> +        } else {
> +            Container *container = (Container *)now;
> +
> +            spice_assert(now->type == TREE_ITEM_TYPE_CONTAINER);
> +
> +            if ((ring_item = ring_get_head(&container->items))) {
> +                now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
> +                continue;
> +            }
> +            ring_item = now->siblings_link.prev;
> +            container_free(container);
> +        }
> +        if (now == item) {
> +            return;
> +        }
> +
> +        if ((ring_item = ring_next(&container->items, ring_item))) {
> +            now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
> +        } else {
> +            now = (TreeItem *)container;
> +        }
> +    }
> +}
> +
> +static void current_remove_all(DisplayChannel *display, int surface_id)
> +{
> +    Ring *ring = &display->surfaces[surface_id].current;
> +    RingItem *ring_item;
> +
> +    while ((ring_item = ring_get_head(ring))) {
> +        TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
> +        current_remove(display, now);
> +    }
> +}
> +
>  static int current_add_equal(DisplayChannel *display, DrawItem *item, TreeItem *other)
>  {
>      DrawItem *other_draw_item;
> diff --git a/server/display-channel.h b/server/display-channel.h
> index 05b0e0e..3f3c278 100644
> --- a/server/display-channel.h
> +++ b/server/display-channel.h
> @@ -433,12 +433,9 @@ static inline void region_add_clip_rects(QRegion *rgn, SpiceClipRects *data)
>  }
>
>  uint32_t generate_uid(DisplayChannel *display);
> -void current_remove_drawable(DisplayChannel *display, Drawable *item);
>  void red_pipes_remove_drawable(Drawable *drawable);
> -void current_remove(DisplayChannel *display, TreeItem *item);
>  void detach_streams_behind(DisplayChannel *display, QRegion *region, Drawable *drawable);
>  void drawable_draw(DisplayChannel *display, Drawable *item);
> -void current_remove_all(DisplayChannel *display, int surface_id);
>  void drawables_init(DisplayChannel *display);
>
>  #endif /* DISPLAY_CHANNEL_H_ */
> diff --git a/server/red_worker.c b/server/red_worker.c
> index b308e97..eb4be25 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -186,86 +186,6 @@ void red_drawable_unref(RedWorker *worker, RedDrawable *red_drawable,
>      free(red_drawable);
>  }
>
> -static void display_stream_trace_add_drawable(DisplayChannel *display, Drawable *item)
> -{
> -    ItemTrace *trace;
> -
> -    if (item->stream || !item->streamable) {
> -        return;
> -    }
> -
> -    trace = &display->items_trace[display->next_item_trace++ & ITEMS_TRACE_MASK];
> -    trace->time = item->creation_time;
> -    trace->frames_count = item->frames_count;
> -    trace->gradual_frames_count = item->gradual_frames_count;
> -    trace->last_gradual_frame = item->last_gradual_frame;
> -    SpiceRect* src_area = &item->red_drawable->u.copy.src_area;
> -    trace->width = src_area->right - src_area->left;
> -    trace->height = src_area->bottom - src_area->top;
> -    trace->dest_area = item->red_drawable->bbox;
> -}
> -
> -void current_remove_drawable(DisplayChannel *display, Drawable *item)
> -{
> -    /* todo: move all to unref? */
> -    display_stream_trace_add_drawable(display, item);
> -    draw_item_remove_shadow(&item->tree_item);
> -    ring_remove(&item->tree_item.base.siblings_link);
> -    ring_remove(&item->list_link);
> -    ring_remove(&item->surface_list_link);
> -    display_channel_drawable_unref(display, item);
> -    display->current_size--;
> -}
> -
> -void current_remove(DisplayChannel *display, TreeItem *item)
> -{
> -    TreeItem *now = item;
> -
> -    /* depth-first tree traversal, TODO: do a to tree_foreach()? */
> -    for (;;) {
> -        Container *container = now->container;
> -        RingItem *ring_item;
> -
> -        if (now->type == TREE_ITEM_TYPE_DRAWABLE) {
> -            Drawable *drawable = SPICE_CONTAINEROF(now, Drawable, tree_item);
> -            ring_item = now->siblings_link.prev;
> -            red_pipes_remove_drawable(drawable);
> -            current_remove_drawable(display, drawable);
> -        } else {
> -            Container *container = (Container *)now;
> -
> -            spice_assert(now->type == TREE_ITEM_TYPE_CONTAINER);
> -
> -            if ((ring_item = ring_get_head(&container->items))) {
> -                now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
> -                continue;
> -            }
> -            ring_item = now->siblings_link.prev;
> -            container_free(container);
> -        }
> -        if (now == item) {
> -            return;
> -        }
> -
> -        if ((ring_item = ring_next(&container->items, ring_item))) {
> -            now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
> -        } else {
> -            now = (TreeItem *)container;
> -        }
> -    }
> -}
> -
> -void current_remove_all(DisplayChannel *display, int surface_id)
> -{
> -    Ring *ring = &display->surfaces[surface_id].current;
> -    RingItem *ring_item;
> -
> -    while ((ring_item = ring_get_head(ring))) {
> -        TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
> -        current_remove(display, now);
> -    }
> -}
> -
>  static void red_process_draw(RedWorker *worker, RedDrawable *red_drawable,
>                               uint32_t group_id)
>  {
> diff --git a/server/stream.c b/server/stream.c
> index 08224d8..50881e5 100644
> --- a/server/stream.c
> +++ b/server/stream.c
> @@ -904,3 +904,22 @@ void stream_timeout(DisplayChannel *display)
>          }
>      }
>  }
> +
> +void stream_trace_add_drawable(DisplayChannel *display, Drawable *item)
> +{
> +    ItemTrace *trace;
> +
> +    if (item->stream || !item->streamable) {
> +        return;
> +    }
> +
> +    trace = &display->items_trace[display->next_item_trace++ & ITEMS_TRACE_MASK];
> +    trace->time = item->creation_time;
> +    trace->frames_count = item->frames_count;
> +    trace->gradual_frames_count = item->gradual_frames_count;
> +    trace->last_gradual_frame = item->last_gradual_frame;
> +    SpiceRect* src_area = &item->red_drawable->u.copy.src_area;
> +    trace->width = src_area->right - src_area->left;
> +    trace->height = src_area->bottom - src_area->top;
> +    trace->dest_area = item->red_drawable->bbox;
> +}
> diff --git a/server/stream.h b/server/stream.h
> index 35cbf5f..b11b10f 100644
> --- a/server/stream.h
> +++ b/server/stream.h
> @@ -157,6 +157,8 @@ void                  stream_maintenance                            (DisplayChan
>                                                                       Drawable *prev);
>  void                  stream_timeout                                (DisplayChannel *display);
>  void                  stream_detach_and_stop                        (DisplayChannel *display);
> +void                  stream_trace_add_drawable                     (DisplayChannel *display,
> +                                                                     Drawable *item);
>
>  void                  stream_agent_unref                            (DisplayChannel *display,
>                                                                       StreamAgent *agent);
> --
> 2.4.3
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel

Be aware that this patch depends on changes on the first one ...
Acked-by: Fabiano Fidêncio <fidencio at redhat.com>


More information about the Spice-devel mailing list