[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