[Spice-devel] [PATCH spice-gtk 1/2] channel-webdav: Write mux message in a single memory block

Frediano Ziglio fziglio at redhat.com
Wed Jul 3 08:34:31 UTC 2019


Reduce number of write to the channel.
This will also help making the write to socket all asynchronous
avoiding potential blockages.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 src/channel-webdav.c | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/src/channel-webdav.c b/src/channel-webdav.c
index f5a38ad3..a4bc1cb2 100644
--- a/src/channel-webdav.c
+++ b/src/channel-webdav.c
@@ -179,6 +179,8 @@ static void output_queue_push(OutputQueue *q, const guint8 *buf, gsize size,
         q->idle_id = g_idle_add(output_queue_idle, q);
 }
 
+#define MAX_MUX_SIZE G_MAXUINT16
+
 typedef struct Client
 {
     guint refs;
@@ -187,11 +189,11 @@ typedef struct Client
     gint64 id;
     GCancellable *cancellable;
 
-    struct _mux {
+    struct {
         gint64 id;
         guint16 size;
-        guint8 *buf;
-    } mux;
+        guint8 buf[MAX_MUX_SIZE];
+    } *mux;
 } Client;
 
 static void
@@ -200,7 +202,7 @@ client_unref(Client *client)
     if (--client->refs > 0)
         return;
 
-    g_free(client->mux.buf);
+    g_free(client->mux);
 
     g_object_unref(client->pipe);
     g_object_unref(client->cancellable);
@@ -231,7 +233,7 @@ static void mux_pushed_cb(OutputQueue *q, gpointer user_data)
 {
     Client *client = user_data;
 
-    if (client->mux.size == 0 ||
+    if (client->mux->size == 0 ||
         !client_start_read(client)) {
         remove_client(client);
     }
@@ -239,8 +241,6 @@ static void mux_pushed_cb(OutputQueue *q, gpointer user_data)
     client_unref(client);
 }
 
-#define MAX_MUX_SIZE G_MAXUINT16
-
 static void server_reply_cb(GObject *source_object,
                             GAsyncResult *res,
                             gpointer user_data)
@@ -256,12 +256,10 @@ static void server_reply_cb(GObject *source_object,
 
     g_return_if_fail(size <= MAX_MUX_SIZE);
     g_return_if_fail(size >= 0);
-    client->mux.size = size;
+    client->mux->size = GUINT16_TO_LE(size);
 
-    output_queue_push(c->queue, (guint8 *)&client->mux.id, sizeof(gint64), NULL, NULL);
-    client->mux.size = GUINT16_TO_LE(client->mux.size);
-    output_queue_push(c->queue, (guint8 *)&client->mux.size, sizeof(guint16), NULL, NULL);
-    output_queue_push(c->queue, (guint8 *)client->mux.buf, size, (GFunc)mux_pushed_cb, client);
+    output_queue_push(c->queue, (guint8 *)client->mux, sizeof(gint64) + sizeof(guint16) + size,
+                      (GFunc)mux_pushed_cb, client);
 
     return;
 
@@ -284,7 +282,7 @@ static bool client_start_read(Client *client)
     if (g_input_stream_is_closed(input)) {
         return false;
     }
-    g_input_stream_read_async(input, client->mux.buf, MAX_MUX_SIZE,
+    g_input_stream_read_async(input, client->mux->buf, MAX_MUX_SIZE,
                               G_PRIORITY_DEFAULT, client->cancellable, server_reply_cb,
                               client_ref(client));
     return true;
@@ -368,8 +366,8 @@ static void start_client(SpiceWebdavChannel *self)
     client->refs = 1;
     client->id = c->demux.client;
     client->self = self;
-    client->mux.id = GINT64_TO_LE(client->id);
-    client->mux.buf = g_malloc0(MAX_MUX_SIZE);
+    client->mux = g_malloc0(sizeof(*client->mux));
+    client->mux->id = GINT64_TO_LE(client->id);
     client->cancellable = g_cancellable_new();
     spice_make_pipe(&client->pipe, &peer);
 
-- 
2.20.1



More information about the Spice-devel mailing list