[Spice-devel] [PATCH 05/20] dcc: use PipeItem refcounting for ImageItem
Jonathon Jongsma
jjongsma at redhat.com
Fri Apr 15 14:52:45 UTC 2016
On Fri, 2016-04-15 at 05:58 -0400, Frediano Ziglio wrote:
> >
> > 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;
>
> Why not these ?
You mean the UpgradeItem ref? That's handled in patch 8.
>
> > case PIPE_ITEM_TYPE_IMAGE:
> > - ((ImageItem *)item)->refs++;
> > + pipe_item_ref(item);
> > break;
> > default:
> > spice_warn_if_reached();
>
> Frediano
More information about the Spice-devel
mailing list