[Spice-devel] [PATCH 02/10] Store QXLInstance in CursorItem

Frediano Ziglio fziglio at redhat.com
Mon Nov 2 01:55:58 PST 2015


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)
+        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



More information about the Spice-devel mailing list