[Spice-devel] [PATCH 13/23] reuse RedPipeItem facilities for RedCursorPipeItem

Frediano Ziglio fziglio at redhat.com
Mon May 16 13:31:23 UTC 2016


Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/cursor-channel.c | 29 ++++++++++-------------------
 1 file changed, 10 insertions(+), 19 deletions(-)

diff --git a/server/cursor-channel.c b/server/cursor-channel.c
index 4df5c66..2d57c59 100644
--- a/server/cursor-channel.c
+++ b/server/cursor-channel.c
@@ -48,7 +48,6 @@ G_STATIC_ASSERT(sizeof(CursorItem) <= QXL_CURSUR_DEVICE_DATA_SIZE);
 typedef struct RedCursorPipeItem {
     RedPipeItem base;
     CursorItem *cursor_item;
-    int refs;
 } RedCursorPipeItem;
 
 struct CursorChannel {
@@ -82,6 +81,8 @@ struct CursorChannelClient {
 #include "cache-item.tmpl.c"
 #undef CLIENT_CURSOR_CACHE
 
+static void cursor_pipe_item_free(RedCursorPipeItem *pipe_item);
+
 static CursorItem *cursor_item_new(QXLInstance *qxl, RedCursorCmd *cmd)
 {
     CursorItem *cursor_item;
@@ -136,8 +137,8 @@ static RedPipeItem *new_cursor_pipe_item(RedChannelClient *rcc, void *data, int
 {
     RedCursorPipeItem *item = spice_malloc0(sizeof(RedCursorPipeItem));
 
-    red_pipe_item_init(&item->base, RED_PIPE_ITEM_TYPE_CURSOR);
-    item->refs = 1;
+    red_pipe_item_init_full(&item->base, RED_PIPE_ITEM_TYPE_CURSOR,
+                            (GDestroyNotify)cursor_pipe_item_free);
     item->cursor_item = data;
     item->cursor_item->refs++;
     return &item->base;
@@ -203,14 +204,9 @@ void cursor_channel_disconnect(CursorChannel *cursor_channel)
 }
 
 
-static void put_cursor_pipe_item(RedCursorPipeItem *pipe_item)
+static void cursor_pipe_item_free(RedCursorPipeItem *pipe_item)
 {
     spice_return_if_fail(pipe_item);
-    spice_return_if_fail(pipe_item->refs > 0);
-
-    if (--pipe_item->refs) {
-        return;
-    }
 
     spice_assert(!red_pipe_item_is_linked(&pipe_item->base));
 
@@ -232,11 +228,9 @@ static void cursor_channel_client_release_item_before_push(CursorChannelClient *
                                                            RedPipeItem *item)
 {
     switch (item->type) {
-    case RED_PIPE_ITEM_TYPE_CURSOR: {
-        RedCursorPipeItem *cursor_pipe_item = SPICE_CONTAINEROF(item, RedCursorPipeItem, base);
-        put_cursor_pipe_item(cursor_pipe_item);
+    case RED_PIPE_ITEM_TYPE_CURSOR:
+        red_pipe_item_unref(item);
         break;
-    }
     case RED_PIPE_ITEM_TYPE_INVAL_ONE:
     case RED_PIPE_ITEM_TYPE_VERB:
     case RED_PIPE_ITEM_TYPE_CURSOR_INIT:
@@ -252,11 +246,9 @@ static void cursor_channel_client_release_item_after_push(CursorChannelClient *c
                                                           RedPipeItem *item)
 {
     switch (item->type) {
-        case RED_PIPE_ITEM_TYPE_CURSOR: {
-            RedCursorPipeItem *cursor_pipe_item = SPICE_CONTAINEROF(item, RedCursorPipeItem, base);
-            put_cursor_pipe_item(cursor_pipe_item);
+        case RED_PIPE_ITEM_TYPE_CURSOR:
+            red_pipe_item_unref(item);
             break;
-        }
         default:
             spice_critical("invalid item type");
     }
@@ -384,9 +376,8 @@ static void cursor_channel_send_item(RedChannelClient *rcc, RedPipeItem *pipe_it
 static RedCursorPipeItem *cursor_pipe_item_ref(RedCursorPipeItem *item)
 {
     spice_return_val_if_fail(item, NULL);
-    spice_return_val_if_fail(item->refs > 0, NULL);
 
-    item->refs++;
+    red_pipe_item_ref(item);
     return item;
 }
 
-- 
2.7.4



More information about the Spice-devel mailing list