From 2c7f8b2918c56656219e09e0d0a7327b0c147253 Mon Sep 17 00:00:00 2001 Message-Id: <2c7f8b2918c56656219e09e0d0a7327b0c147253.1368111914.git.minovotn@redhat.com> In-Reply-To: <405603258af5154387bea676be1f904b6713f6ae.1368111913.git.minovotn@redhat.com> References: <405603258af5154387bea676be1f904b6713f6ae.1368111913.git.minovotn@redhat.com> From: Amit Shah Date: Wed, 24 Apr 2013 08:18:30 +0200 Subject: [PATCH 56/65] virtio-console: Remove any pending watches on close RH-Author: Amit Shah Message-id: <8ea5436d1737d28c14090eeb48ed86110b35a69b.1366724981.git.amit.shah@redhat.com> Patchwork-id: 50834 O-Subject: [RHEL6.5 qemu-kvm PATCH 56/65] virtio-console: Remove any pending watches on close Bugzilla: 909059 RH-Acked-by: Hans de Goede RH-Acked-by: Gerd Hoffmann RH-Acked-by: Paolo Bonzini From: Hans de Goede Signed-off-by: Hans de Goede Signed-off-by: Gerd Hoffmann (cherry picked from commit c3d6b96ebba18d016be26ffa475feea0d81801a2) Signed-off-by: Amit Shah Conflicts: hw/virtio-console.c --- hw/virtio-console.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) Signed-off-by: Michal Novotny --- hw/virtio-console.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/hw/virtio-console.c b/hw/virtio-console.c index b4e5bec..348b4be 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; } @@ -61,8 +63,10 @@ static ssize_t flush_buf(VirtIOSerialPort *port, ret = 0; if (!info->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; @@ -117,6 +121,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; } @@ -140,11 +148,23 @@ static int virtconsole_initfn(VirtIOSerialPort *port) return 0; } +static int virtconsole_exitfn(VirtIOSerialPort *port) +{ + VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); + + if (vcon->watch) { + g_source_remove(vcon->watch); + } + + return 0; +} + static VirtIOSerialPortInfo virtconsole_info = { .qdev.name = "virtconsole", .qdev.size = sizeof(VirtConsole), .is_console = true, .init = virtconsole_initfn, + .exit = virtconsole_exitfn, .have_data = flush_buf, .guest_open = guest_open, .guest_close = guest_close, @@ -164,6 +184,7 @@ static VirtIOSerialPortInfo virtserialport_info = { .qdev.name = "virtserialport", .qdev.size = sizeof(VirtConsole), .init = virtconsole_initfn, + .exit = virtconsole_exitfn, .have_data = flush_buf, .guest_open = guest_open, .guest_close = guest_close, -- 1.7.11.7