[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 5/9] virtio-console: Remove any pending watches on c
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 5/9] virtio-console: Remove any pending watches on close |
Date: |
Tue, 16 Apr 2013 11:56:30 +0200 |
From: Hans de Goede <address@hidden>
Signed-off-by: Hans de Goede <address@hidden>
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/char/virtio-console.c | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
index 061f4bd..6759e51 100644
--- a/hw/char/virtio-console.c
+++ b/hw/char/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 (!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;
@@ -106,6 +110,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;
}
@@ -130,6 +138,17 @@ 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 Property virtconsole_properties[] = {
DEFINE_PROP_CHR("chardev", VirtConsole, chr),
DEFINE_PROP_END_OF_LIST(),
@@ -142,6 +161,7 @@ static void virtconsole_class_init(ObjectClass *klass, void
*data)
k->is_console = true;
k->init = virtconsole_initfn;
+ k->exit = virtconsole_exitfn;
k->have_data = flush_buf;
k->set_guest_connected = set_guest_connected;
dc->props = virtconsole_properties;
--
1.7.9.7
- [Qemu-devel] [PULL 0/9] spice patch queue, Gerd Hoffmann, 2013/04/16
- [Qemu-devel] [PATCH 1/9] qxl: add 4k + 8k resolutions, Gerd Hoffmann, 2013/04/16
- [Qemu-devel] [PATCH 2/9] qxl: add 2000x2000 and 2048x2048 video modes, Gerd Hoffmann, 2013/04/16
- [Qemu-devel] [PATCH 3/9] spice: (32 bit only) fix surface cmd tracking destruction, Gerd Hoffmann, 2013/04/16
- [Qemu-devel] [PATCH 5/9] virtio-console: Remove any pending watches on close,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH 6/9] spice-qemu-char: Remove #ifdef-ed code for old spice-server compat, Gerd Hoffmann, 2013/04/16
- [Qemu-devel] [PATCH 8/9] spice-qemu-char: Remove intermediate buffer, Gerd Hoffmann, 2013/04/16
- [Qemu-devel] [PATCH 4/9] virtio-console: Also throttle when less was written then requested, Gerd Hoffmann, 2013/04/16
- [Qemu-devel] [PATCH 7/9] spice-qemu-char: Add watch support, Gerd Hoffmann, 2013/04/16
- [Qemu-devel] [PATCH 9/9] spice-qemu-char: vmc_write: Don't write more bytes then we're asked too, Gerd Hoffmann, 2013/04/16