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

Jakub Janku jjanku at redhat.com
Wed Jul 3 09:16:16 UTC 2019


On Wed, Jul 3, 2019 at 10:35 AM Frediano Ziglio <fziglio at redhat.com> wrote:
>
> 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));

Why are you allocating mux separately from the client?
It does not change during the lifetime of Client,
so I think we can simply make it a part of the Client struct.

> +    client->mux->id = GINT64_TO_LE(client->id);
>      client->cancellable = g_cancellable_new();
>      spice_make_pipe(&client->pipe, &peer);
>
> --
> 2.20.1
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel

Jakub


More information about the Spice-devel mailing list