[Spice-devel] [PATCH 15/19] worker: move current_remove*
Fabiano Fidêncio
fidencio at redhat.com
Thu Nov 26 01:53:05 PST 2015
On Thu, Nov 26, 2015 at 10:52 AM, Fabiano Fidêncio <fidencio at redhat.com> wrote:
> 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 ...
s/first/previous
> Acked-by: Fabiano Fidêncio <fidencio at redhat.com>
More information about the Spice-devel
mailing list