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 {
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user