Commit f628926b authored by Gerd Hoffmann's avatar Gerd Hoffmann Committed by Anthony Liguori
Browse files

fix monitor



chardev flow control broke monitor, fix it by adding watch support.

Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 2d62a957
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -261,11 +261,30 @@ int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
    }
}

static gboolean monitor_unblocked(GIOChannel *chan, GIOCondition cond,
                                  void *opaque)
{
    monitor_flush(opaque);
    return FALSE;
}

void monitor_flush(Monitor *mon)
{
    int rc;

    if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
        qemu_chr_fe_write(mon->chr, mon->outbuf, mon->outbuf_index);
        rc = qemu_chr_fe_write(mon->chr, mon->outbuf, mon->outbuf_index);
        if (rc == mon->outbuf_index) {
            /* all flushed */
            mon->outbuf_index = 0;
            return;
        }
        if (rc > 0) {
            /* partinal write */
            memmove(mon->outbuf, mon->outbuf + rc, mon->outbuf_index - rc);
            mon->outbuf_index -= rc;
        }
        qemu_chr_fe_add_watch(mon->chr, G_IO_OUT, monitor_unblocked, mon);
    }
}