If the Drawable keeps a pointer to the Display channel that it is associated with, we can unref it directly and not need to pass the 'display' parameter separately to the unref function --- Changes: - remove 'dcc' parameer from release_item_after_push() I agree that additional changes / cleanups could be done in this area, but i'd rather not include them in this patch. server/dcc.c | 18 +++++++----------- server/display-channel.c | 17 +++++++++++------ server/display-channel.h | 4 +++- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/server/dcc.c b/server/dcc.c index 91c3f82..d52d2e4 100644 --- a/server/dcc.c +++ b/server/dcc.c @@ -277,13 +277,11 @@ static void add_drawable_surface_images(DisplayChannelClient *dcc, Drawable *dra void drawable_pipe_item_free(PipeItem *item) { DrawablePipeItem *dpi = SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item); - DisplayChannel *display = DCC_TO_DC(dpi->dcc); - spice_assert(item->refcount == 0); spice_warn_if_fail(!ring_item_is_linked(&item->link)); spice_warn_if_fail(!ring_item_is_linked(&dpi->base)); - display_channel_drawable_unref(display, dpi->drawable); + drawable_unref(dpi->drawable); free(dpi); } @@ -1591,20 +1589,18 @@ int dcc_handle_migrate_data(DisplayChannelClient *dcc, uint32_t size, void *mess return TRUE; } -static void upgrade_item_unref(DisplayChannel *display, UpgradeItem *item) +static void upgrade_item_unref(UpgradeItem *item) { if (--item->refs != 0) return; - display_channel_drawable_unref(display, item->drawable); + drawable_unref(item->drawable); free(item->rects); free(item); } -static void release_item_after_push(DisplayChannelClient *dcc, PipeItem *item) +static void release_item_after_push(PipeItem *item) { - DisplayChannel *display = DCC_TO_DC(dcc); - switch (item->type) { case PIPE_ITEM_TYPE_DRAW: case PIPE_ITEM_TYPE_IMAGE: @@ -1613,7 +1609,7 @@ static void release_item_after_push(DisplayChannelClient *dcc, PipeItem *item) pipe_item_unref(item); break; case PIPE_ITEM_TYPE_UPGRADE: - upgrade_item_unref(display, (UpgradeItem *)item); + upgrade_item_unref((UpgradeItem *)item); break; case PIPE_ITEM_TYPE_GL_SCANOUT: case PIPE_ITEM_TYPE_GL_DRAW: @@ -1651,7 +1647,7 @@ static void release_item_before_push(DisplayChannelClient *dcc, PipeItem *item) } case PIPE_ITEM_TYPE_STREAM_CLIP: case PIPE_ITEM_TYPE_UPGRADE: - upgrade_item_unref(display, (UpgradeItem *)item); + upgrade_item_unref((UpgradeItem *)item); break; case PIPE_ITEM_TYPE_IMAGE: case PIPE_ITEM_TYPE_MONITORS_CONFIG: @@ -1688,7 +1684,7 @@ static void release_item_before_push(DisplayChannelClient *dcc, PipeItem *item) void dcc_release_item(DisplayChannelClient *dcc, PipeItem *item, int item_pushed) { if (item_pushed) - release_item_after_push(dcc, item); + release_item_after_push(item); else release_item_before_push(dcc, item); } diff --git a/server/display-channel.c b/server/display-channel.c index 88dbc74..f2bdc1d 100644 --- a/server/display-channel.c +++ b/server/display-channel.c @@ -397,7 +397,7 @@ static void current_remove_drawable(DisplayChannel *display, Drawable *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); + drawable_unref(item); display->current_size--; } @@ -495,7 +495,7 @@ static int current_add_equal(DisplayChannel *display, DrawItem *item, TreeItem * pipes_add_drawable(display, drawable); } drawable_remove_from_pipes(other_drawable); - display_channel_drawable_unref(display, other_drawable); + drawable_unref(other_drawable); return TRUE; } @@ -538,7 +538,7 @@ static int current_add_equal(DisplayChannel *display, DrawItem *item, TreeItem * /* not sending other_drawable where possible */ drawable_remove_from_pipes(other_drawable); - display_channel_drawable_unref(display, other_drawable); + drawable_unref(other_drawable); return TRUE; } break; @@ -1192,7 +1192,7 @@ void display_channel_process_draw(DisplayChannel *display, RedDrawable *red_draw display_channel_add_drawable(display, drawable); - display_channel_drawable_unref(display, drawable); + drawable_unref(drawable); } int display_channel_wait_for_migrate_data(DisplayChannel *display) @@ -1380,6 +1380,10 @@ Drawable *display_channel_drawable_try_new(DisplayChannel *display, } bzero(drawable, sizeof(Drawable)); + /* Pointer to the display from which the drawable is allocated. This + * pointer is safe to be retained as DisplayChannel lifespan is bigger than + * all drawables. */ + drawable->display = display; drawable->refs = 1; drawable->creation_time = drawable->first_frame_time = spice_get_monotonic_time_ns(); ring_item_init(&drawable->list_link); @@ -1430,8 +1434,9 @@ static void drawable_unref_surface_deps(DisplayChannel *display, Drawable *drawa } } -void display_channel_drawable_unref(DisplayChannel *display, Drawable *drawable) +void drawable_unref(Drawable *drawable) { + DisplayChannel *display = drawable->display; RingItem *item, *next; if (--drawable->refs != 0) @@ -1653,7 +1658,7 @@ static void draw_until(DisplayChannel *display, RedSurface *surface, Drawable *l that display_channel_draw is called for, Otherwise, 'now' would have already been rendered. See the call for red_handle_depends_on_target_surface in red_process_draw */ drawable_draw(display, now); - display_channel_drawable_unref(display, now); + drawable_unref(now); } while (now != last); } diff --git a/server/display-channel.h b/server/display-channel.h index 6b053de..c4a3b19 100644 --- a/server/display-channel.h +++ b/server/display-channel.h @@ -79,8 +79,11 @@ struct Drawable { int surface_deps[3]; uint32_t process_commands_generation; + DisplayChannel *display; }; +void drawable_unref (Drawable *drawable); + #define LINK_TO_DPI(ptr) SPICE_CONTAINEROF((ptr), DrawablePipeItem, base) #define DRAWABLE_FOREACH_DPI_SAFE(drawable, link, next, dpi) \ SAFE_FOREACH(link, next, drawable, &(drawable)->pipes, dpi, LINK_TO_DPI(link)) @@ -280,7 +283,6 @@ void display_channel_compress_stats_print (const Disp void display_channel_compress_stats_reset (DisplayChannel *display); Drawable * display_channel_drawable_try_new (DisplayChannel *display, int process_commands_generation); -void display_channel_drawable_unref (DisplayChannel *display, Drawable *drawable); void display_channel_surface_unref (DisplayChannel *display, uint32_t surface_id); bool display_channel_surface_has_canvas (DisplayChannel *display, -- 2.4.11 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel