From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> --- server/red_worker.c | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/server/red_worker.c b/server/red_worker.c index 7a4822a..93e0efb 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -853,7 +853,7 @@ static inline PipeItem *red_pipe_get_tail(DisplayChannelClient *dcc) return (PipeItem*)ring_get_tail(&RED_CHANNEL_CLIENT(dcc)->pipe); } -static inline void red_destroy_surface(RedWorker *worker, uint32_t surface_id); +static void red_surface_unref(RedWorker *worker, uint32_t surface_id); static inline void red_pipes_remove_drawable(Drawable *drawable) { @@ -1016,36 +1016,37 @@ static void stop_streams(DisplayChannel *display) memset(display->items_trace, 0, sizeof(display->items_trace)); } -static inline void red_destroy_surface(RedWorker *worker, uint32_t surface_id) +static void red_surface_unref(RedWorker *worker, uint32_t surface_id) { DisplayChannel *display = worker->display_channel; RedSurface *surface = &worker->surfaces[surface_id]; DisplayChannelClient *dcc; RingItem *link, *next; - if (!--surface->refs) { - // only primary surface streams are supported - if (is_primary_surface(worker->display_channel, surface_id)) { - stop_streams(display); - } - spice_assert(surface->context.canvas); + if (--surface->refs != 0) + return; - surface->context.canvas->ops->destroy(surface->context.canvas); - if (surface->create.info) { - worker->qxl->st->qif->release_resource(worker->qxl, surface->create); - } - if (surface->destroy.info) { - worker->qxl->st->qif->release_resource(worker->qxl, surface->destroy); - } + // only primary surface streams are supported + if (is_primary_surface(worker->display_channel, surface_id)) { + stop_streams(display); + } + spice_assert(surface->context.canvas); - region_destroy(&surface->draw_dirty_region); - surface->context.canvas = NULL; - FOREACH_DCC(worker->display_channel, link, next, dcc) { - red_destroy_surface_item(worker, dcc, surface_id); - } + surface->context.canvas->ops->destroy(surface->context.canvas); + if (surface->create.info) { + worker->qxl->st->qif->release_resource(worker->qxl, surface->create); + } + if (surface->destroy.info) { + worker->qxl->st->qif->release_resource(worker->qxl, surface->destroy); + } - spice_warn_if(!ring_is_empty(&surface->depend_on_me)); + region_destroy(&surface->draw_dirty_region); + surface->context.canvas = NULL; + FOREACH_DCC(worker->display_channel, link, next, dcc) { + red_destroy_surface_item(worker, dcc, surface_id); } + + spice_warn_if(!ring_is_empty(&surface->depend_on_me)); } static inline void set_surface_release_info(QXLReleaseInfoExt *release_info_ext, @@ -1096,7 +1097,7 @@ static inline void red_dec_surfaces_drawable_dependencies(RedWorker *worker, Dra if (surface_id == -1) { continue; } - red_destroy_surface(worker, surface_id); + red_surface_unref(worker, surface_id); } } @@ -1133,7 +1134,7 @@ static void red_worker_drawable_unref(RedWorker *worker, Drawable *drawable) remove_drawable_dependencies(worker, drawable); red_dec_surfaces_drawable_dependencies(worker, drawable); - red_destroy_surface(worker, drawable->surface_id); + red_surface_unref(worker, drawable->surface_id); RING_FOREACH_SAFE(item, next, &drawable->glz_ring) { SPICE_CONTAINEROF(item, RedGlzDrawable, drawable_link)->drawable = NULL; @@ -3165,7 +3166,7 @@ static inline void red_process_surface(RedWorker *worker, RedSurfaceCmd *surface red_current_clear will remove them from the pipe. */ red_current_clear(worker, surface_id); red_clear_surface_drawables_from_pipes(worker, surface_id, FALSE); - red_destroy_surface(worker, surface_id); + red_surface_unref(worker, surface_id); break; default: spice_error("unknown surface command"); @@ -9235,7 +9236,7 @@ static inline void dev_destroy_surfaces(RedWorker *worker) if (worker->surfaces[i].context.canvas) { destroy_surface_wait(worker, i); if (worker->surfaces[i].context.canvas) { - red_destroy_surface(worker, i); + red_surface_unref(worker, i); } spice_assert(!worker->surfaces[i].context.canvas); } @@ -9367,7 +9368,7 @@ static void dev_destroy_primary_surface(RedWorker *worker, uint32_t surface_id) flush_all_qxl_commands(worker); dev_destroy_surface_wait(worker, 0); - red_destroy_surface(worker, 0); + red_surface_unref(worker, 0); spice_warn_if_fail(ring_is_empty(&display->streams)); spice_assert(!worker->surfaces[surface_id].context.canvas); -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel