mirror of https://github.com/xqemu/xqemu.git
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:
parent
2d62a95766
commit
f628926bb4
23
monitor.c
23
monitor.c
|
@ -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)
|
void monitor_flush(Monitor *mon)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
|
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);
|
||||||
mon->outbuf_index = 0;
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue