From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:50580) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UHx9X-0003mA-Vb for qemu-devel@nongnu.org; Tue, 19 Mar 2013 10:04:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UHx9P-0005ZV-0t for qemu-devel@nongnu.org; Tue, 19 Mar 2013 10:04:35 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36022) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UHx9O-0005Y3-Q9 for qemu-devel@nongnu.org; Tue, 19 Mar 2013 10:04:26 -0400 From: Gerd Hoffmann Date: Tue, 19 Mar 2013 15:04:23 +0100 Message-Id: <1363701863-13004-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH] fix monitor List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: amit.shah@redhat.com, Markus Armbruster , Gerd Hoffmann , anthony@codemonkey.ws, Luiz Capitulino chardev flow control broke monitor, fix it by adding watch support. Signed-off-by: Gerd Hoffmann --- v2: fix tyops --- monitor.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/monitor.c b/monitor.c index 112e920..74807f9 100644 --- a/monitor.c +++ b/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) { + 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) { + /* partial 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); } } -- 1.7.9.7