[Spice-devel] [PATCH 02/10] Store QXLInstance in CursorItem
Fabiano FidĂȘncio
fidencio at redhat.com
Mon Nov 2 08:11:04 PST 2015
On Mon, Nov 2, 2015 at 5:00 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
>>
>> On Mon, Nov 2, 2015 at 10:55 AM, Frediano Ziglio <fziglio at redhat.com> wrote:
>> > From: Marc-André Lureau <marcandre.lureau at gmail.com>
>> >
>> > 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 <jjongsma at redhat.com>
>> > ---
>> > 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.
I just think the check for > 0 is the proper test we want to do,
mainly considering that refs is a int (and not a uint)
> Are you suggesting to change the test to avoid
> multiple free (hoping memory is still untouched after the first one) ?
I really didn't think about this.
>
> 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
>> > Spice-devel at lists.freedesktop.org
>> > http://lists.freedesktop.org/mailman/listinfo/spice-devel
>>
>> ACK!
>>
>
> Frediano
More information about the Spice-devel
mailing list