Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/display-channel.c | 23 ++++++++++++++--------- server/display-channel.h | 2 +- server/red-worker.c | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/server/display-channel.c b/server/display-channel.c index 5e9bc7d..5cdd0cb 100644 --- a/server/display-channel.c +++ b/server/display-channel.c @@ -169,9 +169,8 @@ static void stop_streams(DisplayChannel *display) memset(display->priv->items_trace, 0, sizeof(display->priv->items_trace)); } -void display_channel_surface_unref(DisplayChannel *display, uint32_t surface_id) +static void display_channel_surface_unref(DisplayChannel *display, RedSurface *surface) { - RedSurface *surface = &display->priv->surfaces[surface_id]; QXLInstance *qxl = display->common.qxl; DisplayChannelClient *dcc; GListIter iter; @@ -182,7 +181,7 @@ void display_channel_surface_unref(DisplayChannel *display, uint32_t surface_id) } // only primary surface streams are supported - if (is_primary_surface(display, surface_id)) { + if (is_primary_surface(display, surface->id)) { stop_streams(display); } spice_assert(surface->context.canvas); @@ -198,7 +197,7 @@ void display_channel_surface_unref(DisplayChannel *display, uint32_t surface_id) region_destroy(&surface->draw_dirty_region); surface->context.canvas = NULL; FOREACH_DCC(display, iter, dcc) { - dcc_destroy_surface(dcc, surface_id); + dcc_destroy_surface(dcc, surface->id); } spice_warn_if_fail(ring_is_empty(&surface->depend_on_me)); @@ -211,6 +210,11 @@ gboolean display_channel_surface_has_canvas(DisplayChannel *display, return display->priv->surfaces[surface_id].context.canvas != NULL; } +void display_channel_surface_id_unref(DisplayChannel *display, uint32_t surface_id) +{ + display_channel_surface_unref(display, &display->priv->surfaces[surface_id]); +} + static void streams_update_visible_region(DisplayChannel *display, Drawable *drawable) { Ring *ring; @@ -1333,7 +1337,7 @@ static void drawable_unref_surface_deps(DisplayChannel *display, Drawable *drawa if (surface == NULL) { continue; } - display_channel_surface_unref(display, surface->id); + display_channel_surface_unref(display, surface); } } @@ -1354,7 +1358,7 @@ void drawable_unref(Drawable *drawable) drawable_remove_dependencies(display, drawable); drawable_unref_surface_deps(display, drawable); - display_channel_surface_unref(display, drawable->surface->id); + display_channel_surface_unref(display, drawable->surface); glz_retention_detach_drawables(&drawable->glz_retention); @@ -1709,13 +1713,14 @@ static void clear_surface_drawables_from_pipes(DisplayChannel *display, int surf /* TODO: cleanup/refactor destroy functions */ static void display_channel_destroy_surface(DisplayChannel *display, uint32_t surface_id) { + RedSurface *surface = &display->priv->surfaces[surface_id]; draw_depend_on_me(display, surface_id); /* note that draw_depend_on_me must be called before current_remove_all. otherwise "current" will hold items that other drawables may depend on, and then current_remove_all will remove them from the pipe. */ - current_remove_all(display, &display->priv->surfaces[surface_id]); + current_remove_all(display, surface); clear_surface_drawables_from_pipes(display, surface_id, FALSE); - display_channel_surface_unref(display, surface_id); + display_channel_surface_unref(display, surface); } void display_channel_destroy_surface_wait(DisplayChannel *display, uint32_t surface_id) @@ -1745,7 +1750,7 @@ void display_channel_destroy_surfaces(DisplayChannel *display) if (display->priv->surfaces[i].context.canvas) { display_channel_destroy_surface_wait(display, i); if (display->priv->surfaces[i].context.canvas) { - display_channel_surface_unref(display, i); + display_channel_surface_unref(display, &display->priv->surfaces[i]); } spice_assert(!display->priv->surfaces[i].context.canvas); } diff --git a/server/display-channel.h b/server/display-channel.h index 8918ccb..a425364 100644 --- a/server/display-channel.h +++ b/server/display-channel.h @@ -266,7 +266,7 @@ void display_channel_set_video_codecs (DisplayCha int display_channel_get_streams_timeout (DisplayChannel *display); void display_channel_compress_stats_print (const DisplayChannel *display); void display_channel_compress_stats_reset (DisplayChannel *display); -void display_channel_surface_unref (DisplayChannel *display, +void display_channel_surface_id_unref (DisplayChannel *display, uint32_t surface_id); void display_channel_current_flush (DisplayChannel *display, int surface_id); diff --git a/server/red-worker.c b/server/red-worker.c index b3f6c12..7252487 100644 --- a/server/red-worker.c +++ b/server/red-worker.c @@ -670,7 +670,7 @@ static void destroy_primary_surface(RedWorker *worker, uint32_t surface_id) flush_all_qxl_commands(worker); display_channel_destroy_surface_wait(display, 0); - display_channel_surface_unref(display, 0); + display_channel_surface_id_unref(display, 0); /* FIXME: accessing private data only for warning purposes... spice_warn_if_fail(ring_is_empty(&display->streams)); -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel