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

Jakub Janku jjanku at redhat.com
Wed Jul 3 10:29:58 UTC 2019


Acked-by: Jakub Janků <jjanku at redhat.com>

On Wed, Jul 3, 2019 at 11:42 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>
> ---
> Changes sinve v1:
> - make "mux" a simple structure, not a pointer to a structure
> ---
>  src/channel-webdav.c | 19 +++++++------------
>  1 file changed, 7 insertions(+), 12 deletions(-)
>
> diff --git a/src/channel-webdav.c b/src/channel-webdav.c
> index f5a38ad3..0fa0d69b 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,10 +189,10 @@ typedef struct Client
>      gint64 id;
>      GCancellable *cancellable;
>
> -    struct _mux {
> +    struct {
>          gint64 id;
>          guint16 size;
> -        guint8 *buf;
> +        guint8 buf[MAX_MUX_SIZE];
>      } mux;
>  } Client;
>
> @@ -200,8 +202,6 @@ client_unref(Client *client)
>      if (--client->refs > 0)
>          return;
>
> -    g_free(client->mux.buf);
> -
>      g_object_unref(client->pipe);
>      g_object_unref(client->cancellable);
>
> @@ -239,8 +239,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 +254,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;
>
> @@ -369,7 +365,6 @@ static void start_client(SpiceWebdavChannel *self)
>      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->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


More information about the Spice-devel mailing list