Signed-off-by: Hans de Goede <hdego...@redhat.com> --- hw/virtio-console.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/hw/virtio-console.c b/hw/virtio-console.c index 1d87c5b..ec0f91b 100644 --- a/hw/virtio-console.c +++ b/hw/virtio-console.c @@ -18,6 +18,7 @@ typedef struct VirtConsole { VirtIOSerialPort port; CharDriverState *chr; + guint watch; } VirtConsole; /* @@ -29,6 +30,7 @@ static gboolean chr_write_unblocked(GIOChannel *chan, GIOCondition cond, { VirtConsole *vcon = opaque; + vcon->watch = 0; virtio_serial_throttle_port(&vcon->port, false); return FALSE; } @@ -60,8 +62,10 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len) ret = 0; if (!k->is_console) { virtio_serial_throttle_port(port, true); - qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, chr_write_unblocked, - vcon); + if (!vcon->watch) { + vcon->watch = qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, + chr_write_unblocked, vcon); + } } } return ret; @@ -86,6 +90,10 @@ static void guest_close(VirtIOSerialPort *port) if (!vcon->chr) { return; } + if (vcon->watch) { + g_source_remove(vcon->watch); + vcon->watch = 0; + } qemu_chr_fe_close(vcon->chr); } @@ -116,6 +124,10 @@ static void chr_event(void *opaque, int event) virtio_serial_open(&vcon->port); break; case CHR_EVENT_CLOSED: + if (vcon->watch) { + g_source_remove(vcon->watch); + vcon->watch = 0; + } virtio_serial_close(&vcon->port); break; } -- 1.8.1.4