[Spice-devel] [PATCH v3 4/9] MainChannel: remove another init_send_data arg

Jonathon Jongsma jjongsma at redhat.com
Mon Dec 19 21:05:27 UTC 2016


Use spice_marshaller_add_by_ref_full() instead of _add_by_ref() to
handle the referenced data properly rather than passing the pipe item to
red_channel_client_init_send_data() to keep the pipe item alive
indirectly.
---
 server/main-channel-client.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/server/main-channel-client.c b/server/main-channel-client.c
index 7e55b24..4a64a40 100644
--- a/server/main-channel-client.c
+++ b/server/main-channel-client.c
@@ -833,12 +833,20 @@ static void main_channel_marshall_tokens(RedChannelClient *rcc,
     spice_marshall_msg_main_agent_token(m, &tokens);
 }
 
+static void marshaller_free_pipe_item(uint8_t *data, void *opaque)
+{
+    RedPipeItem *pipe_item = opaque;
+    red_pipe_item_unref(pipe_item);
+}
+
 static void main_channel_marshall_agent_data(RedChannelClient *rcc,
                                              SpiceMarshaller *m,
                                              RedAgentDataPipeItem *item)
 {
-    red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_AGENT_DATA, &item->base);
-    spice_marshaller_add_by_ref(m, item->data, item->len);
+    red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_AGENT_DATA, NULL);
+    /* since pipe item owns the data, keep it alive until it's sent */
+    red_pipe_item_ref(&item->base);
+    spice_marshaller_add_by_ref_full(m, item->data, item->len, marshaller_free_pipe_item, item);
 }
 
 static void main_channel_marshall_migrate_data_item(RedChannelClient *rcc,
@@ -846,7 +854,7 @@ static void main_channel_marshall_migrate_data_item(RedChannelClient *rcc,
                                                     RedPipeItem *item)
 {
     RedChannel *channel = red_channel_client_get_channel(rcc);
-    red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, item);
+    red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, NULL);
     // TODO: from reds split. ugly separation.
     reds_marshall_migrate_data(red_channel_get_server(channel), m);
 }
-- 
2.7.4



More information about the Spice-devel mailing list