[Spice-devel] [spice-gtk v2 3/4] spice-channel: move out non blocking logic of _flush_wire()

Christophe Fergeau cfergeau at redhat.com
Tue Feb 21 17:13:38 UTC 2017


Ok, 
Acked-by: Christophe Fergeau <cfergeau at redhat.com>

On Fri, Feb 03, 2017 at 04:13:39PM +0100, Victor Toso wrote:
> From: Victor Toso <me at victortoso.com>
> 
> This patch introduces spice_channel_flush_wire_nonblocking() helper
> without changing any logic.
> 
> Related: https://bugs.freedesktop.org/show_bug.cgi?id=96598
> Signed-off-by: Victor Toso <victortoso at redhat.com>
> ---
>  src/spice-channel.c | 73 +++++++++++++++++++++++++++++++++++------------------
>  1 file changed, 48 insertions(+), 25 deletions(-)
> 
> diff --git a/src/spice-channel.c b/src/spice-channel.c
> index d1714df..9e43c6c 100644
> --- a/src/spice-channel.c
> +++ b/src/spice-channel.c
> @@ -769,6 +769,53 @@ void spice_msg_out_send_internal(SpiceMsgOut *out)
>  }
>  
>  /*
> + * Helper function to deal with the nonblocking part of _flush_wire() function.
> + * It returns the result of the write and will set the proper bits in @cond in
> + * case the write function would block.
> + *
> + * Returns -1 in case of any problems.
> + */
> +/* coroutine context */
> +static gint spice_channel_flush_wire_nonblocking(SpiceChannel *channel,
> +                                                 const gchar *ptr,
> +                                                 size_t len,
> +                                                 GIOCondition *cond)
> +{
> +    SpiceChannelPrivate *c = channel->priv;
> +    gssize ret;
> +
> +    g_assert(cond != NULL);
> +    *cond = 0;
> +
> +    if (c->tls) {
> +        ret = SSL_write(c->ssl, ptr, len);
> +        if (ret < 0) {
> +            ret = SSL_get_error(c->ssl, ret);
> +            if (ret == SSL_ERROR_WANT_READ)
> +                *cond |= G_IO_IN;
> +            if (ret == SSL_ERROR_WANT_WRITE)
> +                *cond |= G_IO_OUT;
> +            ret = -1;
> +        }
> +    } else {
> +        GError *error = NULL;
> +        ret = g_pollable_output_stream_write_nonblocking(G_POLLABLE_OUTPUT_STREAM(c->out),
> +                                                         ptr, len, NULL, &error);
> +        if (ret < 0) {
> +            if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
> +                *cond = G_IO_OUT;
> +            } else {
> +                CHANNEL_DEBUG(channel, "Send error %s", error->message);
> +            }
> +            g_clear_error(&error);
> +            ret = -1;
> +        }
> +    }
> +
> +    return ret;
> +}
> +
> +/*
>   * Write all 'data' of length 'datalen' bytes out to
>   * the wire
>   */
> @@ -784,34 +831,10 @@ static void spice_channel_flush_wire(SpiceChannel *channel,
>  
>      while (offset < datalen) {
>          gssize ret;
> -        GError *error = NULL;
>  
>          if (c->has_error) return;
>  
> -        cond = 0;
> -        if (c->tls) {
> -            ret = SSL_write(c->ssl, ptr+offset, datalen-offset);
> -            if (ret < 0) {
> -                ret = SSL_get_error(c->ssl, ret);
> -                if (ret == SSL_ERROR_WANT_READ)
> -                    cond |= G_IO_IN;
> -                if (ret == SSL_ERROR_WANT_WRITE)
> -                    cond |= G_IO_OUT;
> -                ret = -1;
> -            }
> -        } else {
> -            ret = g_pollable_output_stream_write_nonblocking(G_POLLABLE_OUTPUT_STREAM(c->out),
> -                                                             ptr+offset, datalen-offset, NULL, &error);
> -            if (ret < 0) {
> -                if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
> -                    cond = G_IO_OUT;
> -                } else {
> -                    CHANNEL_DEBUG(channel, "Send error %s", error->message);
> -                }
> -                g_clear_error(&error);
> -                ret = -1;
> -            }
> -        }
> +        ret = spice_channel_flush_wire_nonblocking(channel, ptr+offset, datalen-offset, &cond);
>          if (ret == -1) {
>              if (cond != 0) {
>                  // TODO: should use g_pollable_input/output_stream_create_source() in 2.28 ?
> -- 
> 2.9.3
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170221/012a0c90/attachment-0001.sig>


More information about the Spice-devel mailing list