[Spice-devel] [PATCH 04/10] worker: s/destroy_surface/surface_unref

Frediano Ziglio fziglio at redhat.com
Mon Nov 9 03:55:45 PST 2015


> 
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
> 
> ---
>  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
> 

Acked and merged

Frediano


More information about the Spice-devel mailing list