> > No need to re-implement refcounting in this subclass. > --- > > Changes since last version: > - remove the dcc/display parameter from the struct since the previous patch > was added that stored a display pointer in the Drawable struct. > > server/dcc.c | 16 +--------------- > server/display-channel.c | 4 +--- > server/display-channel.h | 1 - > server/stream.c | 14 ++++++++++++-- > 4 files changed, 14 insertions(+), 21 deletions(-) > > diff --git a/server/dcc.c b/server/dcc.c > index 4f3f227..09a1fca 100644 > --- a/server/dcc.c > +++ b/server/dcc.c > @@ -1589,16 +1589,6 @@ int dcc_handle_migrate_data(DisplayChannelClient *dcc, > uint32_t size, void *mess > return TRUE; > } > > -static void upgrade_item_unref(UpgradeItem *item) > -{ > - if (--item->refs != 0) > - return; > - > - drawable_unref(item->drawable); > - free(item->rects); > - free(item); > -} > - > static void release_item_after_push(DisplayChannelClient *dcc, PipeItem > *item) > { > switch (item->type) { > @@ -1606,10 +1596,8 @@ static void > release_item_after_push(DisplayChannelClient *dcc, PipeItem *item) > case PIPE_ITEM_TYPE_IMAGE: > case PIPE_ITEM_TYPE_STREAM_CLIP: > case PIPE_ITEM_TYPE_MONITORS_CONFIG: > - pipe_item_unref(item); > - break; > case PIPE_ITEM_TYPE_UPGRADE: > - upgrade_item_unref((UpgradeItem *)item); > + pipe_item_unref(item); > break; > case PIPE_ITEM_TYPE_GL_SCANOUT: > case PIPE_ITEM_TYPE_GL_DRAW: > @@ -1647,8 +1635,6 @@ static void > release_item_before_push(DisplayChannelClient *dcc, PipeItem *item) > } > case PIPE_ITEM_TYPE_STREAM_CLIP: > case PIPE_ITEM_TYPE_UPGRADE: > - upgrade_item_unref((UpgradeItem *)item); > - break; > case PIPE_ITEM_TYPE_IMAGE: > case PIPE_ITEM_TYPE_MONITORS_CONFIG: > pipe_item_unref(item); > diff --git a/server/display-channel.c b/server/display-channel.c > index f2bdc1d..99a490d 100644 > --- a/server/display-channel.c > +++ b/server/display-channel.c > @@ -1978,10 +1978,8 @@ static void hold_item(RedChannelClient *rcc, PipeItem > *item) > case PIPE_ITEM_TYPE_DRAW: > case PIPE_ITEM_TYPE_IMAGE: > case PIPE_ITEM_TYPE_STREAM_CLIP: > - pipe_item_ref(item); > - break; > case PIPE_ITEM_TYPE_UPGRADE: > - ((UpgradeItem *)item)->refs++; > + pipe_item_ref(item); > break; > default: > spice_warn_if_reached(); > diff --git a/server/display-channel.h b/server/display-channel.h > index c4a3b19..c10cfe2 100644 > --- a/server/display-channel.h > +++ b/server/display-channel.h > @@ -247,7 +247,6 @@ typedef struct SurfaceDestroyItem { > > typedef struct UpgradeItem { > PipeItem base; > - int refs; > Drawable *drawable; > SpiceClipRects *rects; > } UpgradeItem; > diff --git a/server/stream.c b/server/stream.c > index ae37a62..22e1004 100644 > --- a/server/stream.c > +++ b/server/stream.c > @@ -758,6 +758,16 @@ void stream_agent_stop(StreamAgent *agent) > } > } > > +static void upgrade_item_free(UpgradeItem *item) > +{ > + g_return_if_fail(item != NULL); > + g_return_if_fail(item->base.refcount != 0); > + > + drawable_unref(item->drawable); > + free(item->rects); > + free(item); > +} > + > /* > * after dcc_detach_stream_gracefully is called for all the display channel > clients, > * detach_stream should be called. See comment (1). > @@ -798,8 +808,8 @@ static void > dcc_detach_stream_gracefully(DisplayChannelClient *dcc, > rect_debug(&stream->current->red_drawable->bbox); > rcc = RED_CHANNEL_CLIENT(dcc); > upgrade_item = spice_new(UpgradeItem, 1); > - upgrade_item->refs = 1; > - pipe_item_init(&upgrade_item->base, PIPE_ITEM_TYPE_UPGRADE); > + pipe_item_init_full(&upgrade_item->base, PIPE_ITEM_TYPE_UPGRADE, > + (GDestroyNotify)upgrade_item_free); > upgrade_item->drawable = stream->current; > upgrade_item->drawable->refs++; > n_rects = > pixman_region32_n_rects(&upgrade_item->drawable->tree_item.base.rgn); Acked-by: Frediano Ziglio <fziglio@xxxxxxxxxx> Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel