[Spice-devel] [PATCH 05/20] dcc: use PipeItem refcounting for ImageItem
Frediano Ziglio
fziglio at redhat.com
Fri Apr 15 14:56:40 UTC 2016
>
> Since the base class now implements refcounting, there's no need to
> re-invent it here.
> ---
> server/dcc-send.c | 4 ++--
> server/dcc.c | 19 +++++--------------
> server/dcc.h | 3 +--
> server/display-channel.c | 2 +-
> 4 files changed, 9 insertions(+), 19 deletions(-)
>
> diff --git a/server/dcc-send.c b/server/dcc-send.c
> index eb866cf..b8d1157 100644
> --- a/server/dcc-send.c
> +++ b/server/dcc-send.c
> @@ -728,7 +728,7 @@ static void
> red_pipe_replace_rendered_drawables_with_images(DisplayChannelClient
>
> spice_assert(image);
> red_channel_client_pipe_remove_and_release(RED_CHANNEL_CLIENT(dcc),
> &dpi->dpi_pipe_item);
> - pipe_item = &image->link;
> + pipe_item = &image->base;
> }
> }
>
> @@ -1949,7 +1949,7 @@ static void red_marshall_image(RedChannelClient *rcc,
> SpiceMarshaller *m, ImageI
> chunks = spice_chunks_new_linear(item->data, bitmap.stride * bitmap.y);
> bitmap.data = chunks;
>
> - red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_COPY,
> &item->link);
> + red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_COPY,
> &item->base);
>
> copy.base.surface_id = item->surface_id;
> copy.base.box.left = item->pos.x;
> diff --git a/server/dcc.c b/server/dcc.c
> index c952042..4e450b5 100644
> --- a/server/dcc.c
> +++ b/server/dcc.c
> @@ -184,9 +184,8 @@ ImageItem
> *dcc_add_surface_area_image(DisplayChannelClient *dcc, int surface_id,
>
> item = (ImageItem *)spice_malloc_n_m(height, stride, sizeof(ImageItem));
>
> - pipe_item_init(&item->link, PIPE_ITEM_TYPE_IMAGE);
> + pipe_item_init(&item->base, PIPE_ITEM_TYPE_IMAGE);
>
> - item->refs = 1;
> item->surface_id = surface_id;
> item->image_format =
> spice_bitmap_from_surface_type(surface->context.format);
> @@ -214,9 +213,9 @@ ImageItem
> *dcc_add_surface_area_image(DisplayChannelClient *dcc, int surface_id,
> }
>
> if (pos) {
> - red_channel_client_pipe_add_after(RED_CHANNEL_CLIENT(dcc),
> &item->link, pos);
> + red_channel_client_pipe_add_after(RED_CHANNEL_CLIENT(dcc),
> &item->base, pos);
> } else {
> - red_channel_client_pipe_add(RED_CHANNEL_CLIENT(dcc), &item->link);
> + red_channel_client_pipe_add(RED_CHANNEL_CLIENT(dcc), &item->base);
> }
>
> return item;
> @@ -1591,14 +1590,6 @@ int dcc_handle_migrate_data(DisplayChannelClient *dcc,
> uint32_t size, void *mess
> return TRUE;
> }
>
> -static void image_item_unref(ImageItem *item)
> -{
> - if (--item->refs != 0)
> - return;
> -
> - free(item);
> -}
> -
> static void upgrade_item_unref(DisplayChannel *display, UpgradeItem *item)
> {
> if (--item->refs != 0)
> @@ -1624,7 +1615,7 @@ static void
> release_item_after_push(DisplayChannelClient *dcc, PipeItem *item)
> upgrade_item_unref(display, (UpgradeItem *)item);
> break;
> case PIPE_ITEM_TYPE_IMAGE:
> - image_item_unref((ImageItem *)item);
> + pipe_item_unref(item);
> break;
> case PIPE_ITEM_TYPE_GL_SCANOUT:
> case PIPE_ITEM_TYPE_GL_DRAW:
> @@ -1674,7 +1665,7 @@ static void
> release_item_before_push(DisplayChannelClient *dcc, PipeItem *item)
> upgrade_item_unref(display, (UpgradeItem *)item);
> break;
> case PIPE_ITEM_TYPE_IMAGE:
> - image_item_unref((ImageItem *)item);
> + pipe_item_unref(item);
> break;
> case PIPE_ITEM_TYPE_CREATE_SURFACE: {
> SurfaceCreateItem *surface_create = SPICE_CONTAINEROF(item,
> SurfaceCreateItem,
> diff --git a/server/dcc.h b/server/dcc.h
> index 071a9fc..3d7870b 100644
> --- a/server/dcc.h
> +++ b/server/dcc.h
> @@ -136,8 +136,7 @@ typedef struct GlDrawItem {
> } GlDrawItem;
>
> typedef struct ImageItem {
> - PipeItem link;
> - int refs;
> + PipeItem base;
> SpicePoint pos;
> int width;
> int height;
> diff --git a/server/display-channel.c b/server/display-channel.c
> index a6d90cf..ac10724 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -1980,7 +1980,7 @@ static void hold_item(RedChannelClient *rcc, PipeItem
> *item)
> ((UpgradeItem *)item)->refs++;
> break;
> case PIPE_ITEM_TYPE_IMAGE:
> - ((ImageItem *)item)->refs++;
> + pipe_item_ref(item);
> break;
> default:
> spice_warn_if_reached();
Acked-by: Frediano Ziglio <fziglio at redhat.com>
Frediano
More information about the Spice-devel
mailing list