> 
> On Mon, Nov 2, 2015 at 10:55 AM, Frediano Ziglio <[email protected]> wrote:
> > From: Marc-André Lureau <[email protected]>
> >
> > Doing so allows us to remove the extra QXLInstance parameter from
> > cursor_item_unref() and makes the code a bit cleaner.
> >
> > Also add cursor_item_ref().
> >
> > Signed-off-by: Jonathon Jongsma <[email protected]>
> > ---
> >  server/cursor-channel.c | 70
> >  +++++++++++++++++++++++++++----------------------
> >  server/cursor-channel.h |  9 ++++---
> >  2 files changed, 44 insertions(+), 35 deletions(-)
> >
> > diff --git a/server/cursor-channel.c b/server/cursor-channel.c
> > index eef0121..d145f86 100644
> > --- a/server/cursor-channel.c
> > +++ b/server/cursor-channel.c
> > @@ -25,55 +25,58 @@
> >  #include "cache_item.tmpl.c"
> >  #undef CLIENT_CURSOR_CACHE
> >
> > -static inline CursorItem *alloc_cursor_item(void)
> > +CursorItem *cursor_item_new(QXLInstance *qxl, RedCursorCmd *cmd, uint32_t
> > group_id)
> >  {
> >      CursorItem *cursor_item;
> >
> > +    spice_return_val_if_fail(cmd != NULL, NULL);
> > +
> >      cursor_item = g_slice_new0(CursorItem);
> > +    cursor_item->qxl = qxl;
> >      cursor_item->refs = 1;
> > +    cursor_item->group_id = group_id;
> > +    cursor_item->red_cursor = cmd;
> >
> >      return cursor_item;
> >  }
> >
> > -CursorItem *cursor_item_new(RedCursorCmd *cmd, uint32_t group_id)
> > +CursorItem *cursor_item_ref(CursorItem *item)
> >  {
> > -    CursorItem *cursor_item;
> > -
> > -    spice_return_val_if_fail(cmd != NULL, NULL);
> > -    cursor_item = alloc_cursor_item();
> > +    spice_return_val_if_fail(item != NULL, NULL);
> > +    spice_return_val_if_fail(item->refs > 0, NULL);
> >
> > -    cursor_item->group_id = group_id;
> > -    cursor_item->red_cursor = cmd;
> > +    item->refs++;
> >
> > -    return cursor_item;
> > +    return item;
> >  }
> >
> > -void cursor_item_unref(QXLInstance *qxl, CursorItem *cursor)
> > +void cursor_item_unref(CursorItem *item)
> >  {
> > -    if (!--cursor->refs) {
> > -        QXLReleaseInfoExt release_info_ext;
> > -        RedCursorCmd *cursor_cmd;
> > -
> > -        cursor_cmd = cursor->red_cursor;
> > -        release_info_ext.group_id = cursor->group_id;
> > -        release_info_ext.info = cursor_cmd->release_info;
> > -        qxl->st->qif->release_resource(qxl, release_info_ext);
> > -        red_put_cursor_cmd(cursor_cmd);
> > -        free(cursor_cmd);
> > -
> > -        g_slice_free(CursorItem, cursor);
> > -    }
> > +    QXLReleaseInfoExt release_info_ext;
> > +    RedCursorCmd *cursor_cmd;
> > +
> > +    spice_return_if_fail(item != NULL);
> > +
> > +    if (--item->refs)
> 
> Just a nitpick, I would prefer to have a explicit comparison here: if
> (--items->refs > 0) ...
>

Why not 

  if (--items->refs != 0) ??

I mean, at the end the results should be the same if no errors managing
the counters are present. Are you suggesting to change the test to avoid
multiple free (hoping memory is still untouched after the first one) ?

I start suspecting that sending the patch when there are pending issue to
be discussed is not really a good idea.

> > +        return;
> > +
> > +    cursor_cmd = item->red_cursor;
> > +    release_info_ext.group_id = item->group_id;
> > +    release_info_ext.info = cursor_cmd->release_info;
> > +    item->qxl->st->qif->release_resource(item->qxl, release_info_ext);
> > +    red_put_cursor_cmd(cursor_cmd);
> > +    free(cursor_cmd);
> > +
> > +    g_slice_free(CursorItem, item);
> > +
> >  }
> >
> >  static void cursor_set_item(CursorChannel *cursor, CursorItem *item)
> >  {
> >      if (cursor->item)
> > -        cursor_item_unref(red_worker_get_qxl(cursor->common.worker),
> > cursor->item);
> > -
> > -    if (item)
> > -        item->refs++;
> > +        cursor_item_unref(cursor->item);
> >
> > -    cursor->item = item;
> > +    cursor->item = item ? cursor_item_ref(item) : NULL;
> >  }
> >
> >  static PipeItem *new_cursor_pipe_item(RedChannelClient *rcc, void *data,
> >  int num)
> > @@ -157,7 +160,7 @@ static void put_cursor_pipe_item(CursorChannelClient
> > *ccc, CursorPipeItem *pipe_
> >
> >      spice_assert(!pipe_item_is_linked(&pipe_item->base));
> >
> > -    cursor_item_unref(red_worker_get_qxl(ccc->common.worker),
> > pipe_item->cursor_item);
> > +    cursor_item_unref(pipe_item->cursor_item);
> >      free(pipe_item);
> >  }
> >
> > @@ -404,7 +407,11 @@ void cursor_channel_process_cmd(CursorChannel *cursor,
> > RedCursorCmd *cursor_cmd,
> >      CursorItem *cursor_item;
> >      int cursor_show = FALSE;
> >
> > -    cursor_item = cursor_item_new(cursor_cmd, group_id);
> > +    spice_return_if_fail(cursor);
> > +    spice_return_if_fail(cursor_cmd);
> > +
> > +    cursor_item =
> > cursor_item_new(red_worker_get_qxl(cursor->common.worker),
> > +                                  cursor_cmd, group_id);
> >
> >      switch (cursor_cmd->type) {
> >      case QXL_CURSOR_SET:
> > @@ -434,7 +441,8 @@ void cursor_channel_process_cmd(CursorChannel *cursor,
> > RedCursorCmd *cursor_cmd,
> >          red_channel_pipes_new_add(&cursor->common.base,
> >                                    new_cursor_pipe_item, cursor_item);
> >      }
> > -    cursor_item_unref(red_worker_get_qxl(cursor->common.worker),
> > cursor_item);
> > +
> > +    cursor_item_unref(cursor_item);
> >  }
> >
> >  void cursor_channel_reset(CursorChannel *cursor)
> > diff --git a/server/cursor-channel.h b/server/cursor-channel.h
> > index 293cfc1..f20001c 100644
> > --- a/server/cursor-channel.h
> > +++ b/server/cursor-channel.h
> > @@ -33,6 +33,7 @@
> >  #define CURSOR_CACHE_HASH_KEY(id) ((id) & CURSOR_CACHE_HASH_MASK)
> >
> >  typedef struct CursorItem {
> > +    QXLInstance *qxl;
> >      uint32_t group_id;
> >      int refs;
> >      RedCursorCmd *red_cursor;
> > @@ -83,14 +84,14 @@ void                 cursor_channel_reset
> > (CursorChannel *cursor);
> >  void                 cursor_channel_process_cmd (CursorChannel *cursor,
> >  RedCursorCmd *cursor_cmd,
> >                                                   uint32_t group_id);
> >
> > -CursorItem*          cursor_item_new            (RedCursorCmd *cmd,
> > uint32_t group_id);
> > -void                 cursor_item_unref          (QXLInstance *qxl,
> > CursorItem *cursor);
> > -
> > -
> >  CursorChannelClient* cursor_channel_client_new(CursorChannel *cursor,
> >                                                 RedClient *client,
> >                                                 RedsStream *stream,
> >                                                 int mig_target,
> >                                                 uint32_t *common_caps, int
> >                                                 num_common_caps,
> >                                                 uint32_t *caps, int
> >                                                 num_caps);
> >
> > +CursorItem*          cursor_item_new            (QXLInstance *qxl,
> > RedCursorCmd *cmd, uint32_t group_id);
> > +CursorItem*          cursor_item_ref            (CursorItem *cursor);
> > +void                 cursor_item_unref          (CursorItem *cursor);
> > +
> >  #endif /* CURSOR_CHANNEL_H_ */
> > --
> > 2.4.3
> >
> > _______________________________________________
> > Spice-devel mailing list
> > [email protected]
> > http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 
> ACK!
> 

Frediano
_______________________________________________
Spice-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to