Amit Shah <[email protected]> writes:

> On (Tue) 05 Mar 2013 [23:21:18], Amit Shah wrote:
>> From: Anthony Liguori <[email protected]>
>> 
>> This is a special GSource that supports CharDriverState style
>> poll callbacks.
>> 
>> For reviewability and bisectability, this code is #if 0'd out in this
>> patch to avoid unused warnings since all of the functions are static.
>> 
>> Signed-off-by: Anthony Liguori <[email protected]>
>> Signed-off-by: Amit Shah <[email protected]>
>
>
>> +static int io_channel_send_all(GIOChannel *fd, const void *_buf, int len1)
>> +{
>> +    GIOStatus status;
>> +    gsize bytes_written;
>> +    int len;
>> +    const uint8_t *buf = _buf;
>> +
>> +    len = len1;
>> +    while (len > 0) {
>> +        status = g_io_channel_write_chars(fd, (const gchar *)buf, len,
>> +                                          &bytes_written, NULL);
>> +        if (status != G_IO_STATUS_NORMAL) {
>> +            if (status != G_IO_STATUS_AGAIN) {
>> +                return -1;
>> +            }
>
> It's not quite right to return -1 here; previous iterations of the
> while loop could have successfully written data, and (len1 - len)
> could be +ve.

Once -1 is returned, it's a terminal error.  It doesn't matter that we
may have written some data.

Regards,

Anthony Liguori

>
> How to approach this?  Convert all callers of qemu_chr_fe_write() to
> also pass a bytes_written param to handle this case?
>
>> +        } else if (status == G_IO_STATUS_EOF) {
>> +            break;
>> +        } else {
>> +            buf += bytes_written;
>> +            len -= bytes_written;
>> +        }
>> +    }
>> +    return len1 - len;
>> +}
>> +#endif
>> +
>>  typedef struct {
>>      int fd_in, fd_out;
>>      int max_size;
>
>               Amit

Reply via email to