[Spice-devel] [PATCH spice-gtk 10/10] gtk: simplify spice_channel_recv_msg

Marc-André Lureau marcandre.lureau at gmail.com
Tue Sep 10 07:44:41 PDT 2013


On Mon, Sep 9, 2013 at 11:11 PM, Yonit Halperin <yhalperi at redhat.com> wrote:
> Looks good. see comment bellow.
>
> On 09/08/2013 02:59 PM, Marc-André Lureau wrote:
>>
>> From: Marc-André Lureau <marcandre.lureau at gmail.com>
>>
>> Use of coroutines allow to simplify spice_channel_recv_msg(), it doesn't
>> need to keep current reading state, it can rely on the coroutine stack
>> for that.
>> ---
>>   gtk/channel-base.c       |  1 +
>>   gtk/spice-channel-priv.h |  3 +--
>>   gtk/spice-channel.c      | 50
>> +++++++++++++++---------------------------------
>>   3 files changed, 17 insertions(+), 37 deletions(-)
>>
>> diff --git a/gtk/channel-base.c b/gtk/channel-base.c
>> index dff3024..6bfce3d 100644
>> --- a/gtk/channel-base.c
>> +++ b/gtk/channel-base.c
>> @@ -187,5 +187,6 @@ void spice_channel_handle_migrate(SpiceChannel
>> *channel, SpiceMsgIn *in)
>>           spice_marshaller_add(out->marshaller, data->data,
>>                                spice_header_get_msg_size(data->header,
>> c->use_mini_header));
>>           spice_msg_out_send_internal(out);
>> +        /* FIXME: who unref in? */
>
> Nice catch. Can't the migrate_data msg be unref-ed here? after
> spice_msg_out_send_internal completes sending it to the dest, nobody uses
> it.
>
>>       }
>>   }
>> diff --git a/gtk/spice-channel-priv.h b/gtk/spice-channel-priv.h
>> index 9e70ff2..53830a8 100644
>> --- a/gtk/spice-channel-priv.h
>> +++ b/gtk/spice-channel-priv.h
>> @@ -59,7 +59,7 @@ struct _SpiceMsgIn {
>>       SpiceChannel          *channel;
>>       uint8_t               header[MAX_SPICE_DATA_HEADER_SIZE];
>>       uint8_t               *data;
>> -    int                   hpos,dpos;
>> +    int                   dpos;
>>       uint8_t               *parsed;
>>       size_t                psize;
>>       message_destructor_t  pfree;
>> @@ -122,7 +122,6 @@ struct _SpiceChannelPrivate {
>>       SpiceLinkReply*             peer_msg;
>>       int                         peer_pos;
>>
>> -    SpiceMsgIn                  *msg_in;
>>       int                         message_ack_window;
>>       int                         message_ack_count;
>>
>> diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c
>> index 4b80029..00e544b 100644
>> --- a/gtk/spice-channel.c
>> +++ b/gtk/spice-channel.c
>> @@ -1770,43 +1770,26 @@ void spice_channel_recv_msg(SpiceChannel *channel,
>>   {
>>       SpiceChannelPrivate *c = channel->priv;
>>       SpiceMsgIn *in;
>> -    int header_size;
>>       int msg_size;
>>       int msg_type;
>>       int sub_list_offset = 0;
>> -    int rc;
>>
>> -    if (!c->msg_in) {
>> -        c->msg_in = spice_msg_in_new(channel);
>> -    }
>> -    in = c->msg_in;
>> -    header_size = spice_header_get_header_size(c->use_mini_header);
>> +    in = spice_msg_in_new(channel);
>>
>>       /* receive message */
>> -    if (in->hpos < header_size) {
>> -        rc = spice_channel_read(channel, in->header + in->hpos,
>> -                                header_size - in->hpos);
>> -        if (rc < 0) {
>> -            g_critical("recv hdr: %s", strerror(errno));
>> -            return;
>> -        }
>> -        in->hpos += rc;
>> -        if (in->hpos < header_size)
>> -            return;
>> -        in->data = spice_malloc(spice_header_get_msg_size(in->header,
>> c->use_mini_header));
>> -    }
>> +    spice_channel_read(channel, in->header,
>> +                       spice_header_get_header_size(c->use_mini_header));
>> +    if (c->has_error)
>> +        goto end;
>> +
>>       msg_size = spice_header_get_msg_size(in->header,
>> c->use_mini_header);
>> -    if (in->dpos < msg_size) {
>> -        rc = spice_channel_read(channel, in->data + in->dpos,
>> -                                msg_size - in->dpos);
>> -        if (rc < 0) {
>> -            g_critical("recv msg: %s", strerror(errno));
>> -            return;
>> -        }
>> -        in->dpos += rc;
>> -        if (in->dpos < msg_size)
>> -            return;
>> -    }
>> +    /* FIXME: do not allow others to take ref on in, and use realloc
>> here?
>> +     * this would avoid malloc/free on each message?
>> +     */
>> +    in->data = spice_malloc(msg_size);
>> +    spice_channel_read(channel, in->data, msg_size);
>> +    if (c->has_error)
>> +        goto end;
>>
>>       msg_type = spice_header_get_msg_type(in->header,
>> c->use_mini_header);
>>       sub_list_offset = spice_header_get_msg_sub_list(in->header,
>> c->use_mini_header);
>> @@ -1829,7 +1812,7 @@ void spice_channel_recv_msg(SpiceChannel *channel,
>>               if (sub_in->parsed == NULL) {
>>                   g_critical("failed to parse sub-message: %s type %d",
>>                              c->name,
>> spice_header_get_msg_type(sub_in->header, c->use_mini_header));
>> -                return;
>> +                goto end;
>>               }
>>               msg_handler(channel, sub_in, data);
>>               spice_msg_in_unref(sub_in);
>> @@ -1851,7 +1834,7 @@ void spice_channel_recv_msg(SpiceChannel *channel,
>>       }
>>
>>       /* parse message */
>> -    in->parsed = c->parser(in->data, in->data + in->dpos, msg_type,
>> +    in->parsed = c->parser(in->data, in->data + msg_size, msg_type,
>>                              c->peer_hdr.minor_version, &in->psize,
>> &in->pfree);
>>       if (in->parsed == NULL) {
>>           g_critical("failed to parse message: %s type %d",
>> @@ -1860,7 +1843,6 @@ void spice_channel_recv_msg(SpiceChannel *channel,
>>       }
>>
>>       /* process message */
>> -    c->msg_in = NULL; /* the function is reentrant, reset state */
>>       /* spice_msg_in_hexdump(in); */
>>       msg_handler(channel, in, data);
>>
>> @@ -1869,8 +1851,6 @@ end:
>>        * to c->in_serial (the server can sometimes skip serials) */
>>       c->last_message_serial = spice_header_get_in_msg_serial(in);
>>       c->in_serial++;
>> -    /* release message */
>> -    c->msg_in = NULL;
>>       spice_msg_in_unref(in);
>>   }
>>
>>
>



-- 
Marc-André Lureau


More information about the Spice-devel mailing list