[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