> > PipeItem already implements refcounting. Use it. > --- > server/dcc.c | 10 +++------- > server/display-channel.c | 4 +--- > server/stream.c | 30 +++++++++++++++--------------- > server/stream.h | 6 +----- > 4 files changed, 20 insertions(+), 30 deletions(-) > > diff --git a/server/dcc.c b/server/dcc.c > index fcef02d..9ada7f1 100644 > --- a/server/dcc.c > +++ b/server/dcc.c > @@ -497,7 +497,7 @@ void dcc_stop(DisplayChannelClient *dcc) > > void dcc_stream_agent_clip(DisplayChannelClient* dcc, StreamAgent *agent) > { > - StreamClipItem *item = stream_clip_item_new(dcc, agent); > + StreamClipItem *item = stream_clip_item_new(agent); > int n_rects; > > item->clip_type = SPICE_CLIP_TYPE_RECTS; > @@ -1601,10 +1601,8 @@ static void > release_item_after_push(DisplayChannelClient *dcc, PipeItem *item) > switch (item->type) { > case PIPE_ITEM_TYPE_DRAW: > case PIPE_ITEM_TYPE_IMAGE: > - pipe_item_unref(item); > - break; > case PIPE_ITEM_TYPE_STREAM_CLIP: > - stream_clip_item_unref(dcc, (StreamClipItem *)item); > + pipe_item_unref(item); > break; > case PIPE_ITEM_TYPE_UPGRADE: > upgrade_item_unref(display, (UpgradeItem *)item); > @@ -1645,14 +1643,12 @@ static void > release_item_before_push(DisplayChannelClient *dcc, PipeItem *item) > stream_agent_unref(display, agent); > break; > } > - case PIPE_ITEM_TYPE_STREAM_CLIP: > - stream_clip_item_unref(dcc, (StreamClipItem *)item); > - break; > case PIPE_ITEM_TYPE_STREAM_DESTROY: { > StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent, > destroy_item); > stream_agent_unref(display, agent); > break; > } > + case PIPE_ITEM_TYPE_STREAM_CLIP: > case PIPE_ITEM_TYPE_UPGRADE: > upgrade_item_unref(display, (UpgradeItem *)item); > break; > diff --git a/server/display-channel.c b/server/display-channel.c > index 4d339f5..88dbc74 100644 > --- a/server/display-channel.c > +++ b/server/display-channel.c > @@ -1972,10 +1972,8 @@ static void hold_item(RedChannelClient *rcc, PipeItem > *item) > switch (item->type) { > case PIPE_ITEM_TYPE_DRAW: > case PIPE_ITEM_TYPE_IMAGE: > - pipe_item_ref(item); > - break; > case PIPE_ITEM_TYPE_STREAM_CLIP: > - ((StreamClipItem *)item)->refs++; > + pipe_item_ref(item); > break; > case PIPE_ITEM_TYPE_UPGRADE: > ((UpgradeItem *)item)->refs++; > diff --git a/server/stream.c b/server/stream.c > index 548c4c7..ae37a62 100644 > --- a/server/stream.c > +++ b/server/stream.c > @@ -133,29 +133,29 @@ void stream_agent_unref(DisplayChannel *display, > StreamAgent *agent) > stream_unref(display, agent->stream); > } > > -StreamClipItem *stream_clip_item_new(DisplayChannelClient* dcc, StreamAgent > *agent) > +void stream_clip_item_free(StreamClipItem *item) > { > - StreamClipItem *item = spice_new(StreamClipItem, 1); > - pipe_item_init((PipeItem *)item, PIPE_ITEM_TYPE_STREAM_CLIP); > - > - item->stream_agent = agent; > - agent->stream->refs++; > - item->refs = 1; > - return item; > -} > - > -void stream_clip_item_unref(DisplayChannelClient *dcc, StreamClipItem *item) > -{ > - DisplayChannel *display = DCC_TO_DC(dcc); > + g_return_if_fail(item != NULL); > + DisplayChannel *display = DCC_TO_DC(item->stream_agent->dcc); > > - if (--item->refs != 0) > - return; > + g_return_if_fail(item->base.refcount == 0); > > stream_agent_unref(display, item->stream_agent); > free(item->rects); > free(item); > } > > +StreamClipItem *stream_clip_item_new(StreamAgent *agent) > +{ > + StreamClipItem *item = spice_new(StreamClipItem, 1); > + pipe_item_init_full((PipeItem *)item, PIPE_ITEM_TYPE_STREAM_CLIP, > + (GDestroyNotify)stream_clip_item_free); > + > + item->stream_agent = agent; > + agent->stream->refs++; > + return item; > +} > + > static int is_stream_start(Drawable *drawable) > { > return ((drawable->frames_count >= RED_STREAM_FRAMES_START_CONDITION) && > diff --git a/server/stream.h b/server/stream.h > index a3e84ed..c83e3b5 100644 > --- a/server/stream.h > +++ b/server/stream.h > @@ -101,16 +101,12 @@ typedef struct StreamAgent { > > typedef struct StreamClipItem { > PipeItem base; > - int refs; > StreamAgent *stream_agent; > int clip_type; > SpiceClipRects *rects; > } StreamClipItem; > > -StreamClipItem * stream_clip_item_new > (DisplayChannelClient* dcc, > - > StreamAgent > *agent); > -void stream_clip_item_unref > (DisplayChannelClient *dcc, > - > StreamClipItem > *item); > +StreamClipItem * stream_clip_item_new > (StreamAgent *agent); > > typedef struct ItemTrace { > red_time_t time; Acked-by: Frediano Ziglio <fziglio@xxxxxxxxxx> Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel