[Spice-devel] [PATCH 3/3] simplify agent data pipe item

Christophe Fergeau cfergeau at redhat.com
Sun Aug 21 23:39:20 PDT 2011


Now that we have a SpiceRefcountedChunk, we can make use of it to
make the code handling the agent data pipe item much simpler and
readable.
---
 server/main_channel.c |   51 ++++++++++++------------------------------------
 1 files changed, 13 insertions(+), 38 deletions(-)

diff --git a/server/main_channel.c b/server/main_channel.c
index db3c617..5347177 100644
--- a/server/main_channel.c
+++ b/server/main_channel.c
@@ -85,17 +85,9 @@ typedef struct TokensPipeItem {
     int tokens;
 } TokensPipeItem;
 
-typedef struct AgentDataPipeItemRefs {
-    int refs;
-} AgentDataPipeItemRefs;
-
 typedef struct AgentDataPipeItem {
     PipeItem base;
-    AgentDataPipeItemRefs *refs;
-    uint8_t* data;
-    size_t len;
-    spice_marshaller_item_free_func free_data;
-    void *opaque;
+    SpiceRefcountedChunk *chunk;
 } AgentDataPipeItem;
 
 typedef struct InitPipeItem {
@@ -229,26 +221,14 @@ static PipeItem *main_tokens_item_new(RedChannelClient *rcc, void *data, int num
     return &item->base;
 }
 
-typedef struct MainAgentDataItemInfo {
-    uint8_t* data;
-    size_t len;
-    spice_marshaller_item_free_func free_data;
-    void *opaque;
-    AgentDataPipeItemRefs *refs;
-} MainAgentDataItemInfo;
-
 static PipeItem *main_agent_data_item_new(RedChannelClient *rcc, void *data, int num)
 {
-    MainAgentDataItemInfo *info = data;
+    SpiceRefcountedChunk *chunk = (SpiceRefcountedChunk *)data;
     AgentDataPipeItem *item = spice_malloc(sizeof(AgentDataPipeItem));
 
     red_channel_pipe_item_init(rcc->channel, &item->base,
                                SPICE_MSG_MAIN_AGENT_DATA);
-    item->refs = info->refs;
-    item->data = info->data;
-    item->len = info->len;
-    item->free_data = info->free_data;
-    item->opaque = info->opaque;
+    item->chunk = spice_refcounted_chunk_ref (chunk);
     return &item->base;
 }
 
@@ -430,23 +410,22 @@ static void main_channel_marshall_tokens(SpiceMarshaller *m, uint32_t num_tokens
 void main_channel_push_agent_data(MainChannel *main_chan, uint8_t* data, size_t len,
            spice_marshaller_item_free_func free_data, void *opaque)
 {
-    MainAgentDataItemInfo info = {
-        .data = data,
-        .len = len,
-        .free_data = free_data,
-        .opaque = opaque,
-        .refs = spice_malloc(sizeof(AgentDataPipeItemRefs)),
-    };
+    SpiceRefcountedChunk *chunk;
 
-    info.refs->refs = main_chan->base.clients_num;
+    chunk = spice_refcounted_chunk_new (data, len, free_data, opaque);
     red_channel_pipes_new_add_push(&main_chan->base,
-        main_agent_data_item_new, &info);
+        main_agent_data_item_new, chunk);
+    spice_refcounted_chunk_unref (chunk);
 }
 
 static void main_channel_marshall_agent_data(SpiceMarshaller *m,
                                   AgentDataPipeItem *item)
 {
-    spice_marshaller_add_ref(m, item->data, item->len);
+    uint8_t *data;
+    size_t len;
+    data = spice_chunk_get_data ((SpiceChunk *)item->chunk);
+    len = spice_chunk_get_len ((SpiceChunk *)item->chunk);
+    spice_marshaller_add_ref(m, data, len);
 }
 
 static void main_channel_push_migrate_data_item(MainChannel *main_chan)
@@ -723,11 +702,7 @@ static void main_channel_release_pipe_item(RedChannelClient *rcc,
     switch (base->type) {
         case SPICE_MSG_MAIN_AGENT_DATA: {
             AgentDataPipeItem *data = (AgentDataPipeItem*)base;
-            if (!--data->refs->refs) {
-                red_printf("SPICE_MSG_MAIN_AGENT_DATA %p %p, %d", data, data->refs, data->refs->refs);
-                free(data->refs);
-                data->free_data(data->data, data->opaque);
-            }
+            spice_refcounted_chunk_unref (data->chunk);
             break;
         }
         case SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST: {
-- 
1.7.6



More information about the Spice-devel mailing list