virtio-console: Remove any pending watches on close
Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
f9fb0532fb
commit
c3d6b96ebb
|
@ -18,6 +18,7 @@
|
||||||
typedef struct VirtConsole {
|
typedef struct VirtConsole {
|
||||||
VirtIOSerialPort port;
|
VirtIOSerialPort port;
|
||||||
CharDriverState *chr;
|
CharDriverState *chr;
|
||||||
|
guint watch;
|
||||||
} VirtConsole;
|
} VirtConsole;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -29,6 +30,7 @@ static gboolean chr_write_unblocked(GIOChannel *chan, GIOCondition cond,
|
||||||
{
|
{
|
||||||
VirtConsole *vcon = opaque;
|
VirtConsole *vcon = opaque;
|
||||||
|
|
||||||
|
vcon->watch = 0;
|
||||||
virtio_serial_throttle_port(&vcon->port, false);
|
virtio_serial_throttle_port(&vcon->port, false);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -61,8 +63,10 @@ static ssize_t flush_buf(VirtIOSerialPort *port,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if (!k->is_console) {
|
if (!k->is_console) {
|
||||||
virtio_serial_throttle_port(port, true);
|
virtio_serial_throttle_port(port, true);
|
||||||
qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, chr_write_unblocked,
|
if (!vcon->watch) {
|
||||||
vcon);
|
vcon->watch = qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT,
|
||||||
|
chr_write_unblocked, vcon);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -106,6 +110,10 @@ static void chr_event(void *opaque, int event)
|
||||||
virtio_serial_open(&vcon->port);
|
virtio_serial_open(&vcon->port);
|
||||||
break;
|
break;
|
||||||
case CHR_EVENT_CLOSED:
|
case CHR_EVENT_CLOSED:
|
||||||
|
if (vcon->watch) {
|
||||||
|
g_source_remove(vcon->watch);
|
||||||
|
vcon->watch = 0;
|
||||||
|
}
|
||||||
virtio_serial_close(&vcon->port);
|
virtio_serial_close(&vcon->port);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -130,6 +138,17 @@ static int virtconsole_initfn(VirtIOSerialPort *port)
|
||||||
return 0;
|
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[] = {
|
static Property virtconsole_properties[] = {
|
||||||
DEFINE_PROP_CHR("chardev", VirtConsole, chr),
|
DEFINE_PROP_CHR("chardev", VirtConsole, chr),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
@ -142,6 +161,7 @@ static void virtconsole_class_init(ObjectClass *klass, void *data)
|
||||||
|
|
||||||
k->is_console = true;
|
k->is_console = true;
|
||||||
k->init = virtconsole_initfn;
|
k->init = virtconsole_initfn;
|
||||||
|
k->exit = virtconsole_exitfn;
|
||||||
k->have_data = flush_buf;
|
k->have_data = flush_buf;
|
||||||
k->set_guest_connected = set_guest_connected;
|
k->set_guest_connected = set_guest_connected;
|
||||||
dc->props = virtconsole_properties;
|
dc->props = virtconsole_properties;
|
||||||
|
|
Loading…
Reference in a new issue