fix monitor

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

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Gerd Hoffmann 2013-03-19 10:57:56 +01:00 committed by Anthony Liguori
parent 2d62a95766
commit f628926bb4

View File

@ -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);
mon->outbuf_index = 0;
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);
}
}