[Spice-devel] [PATCH 07/20] StreamClipItem: use base class refcounting
Frediano Ziglio
fziglio at redhat.com
Fri Apr 15 10:03:15 UTC 2016
>
> 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 at redhat.com>
Frediano
More information about the Spice-devel
mailing list