On Sun, Nov 18, 2012 at 4:29 PM, Paolo Bonzini <pbonz...@redhat.com> wrote: > >> > struct virtio_console_config config; >> > + >> > + struct { >> >> Please add a name, for example PostLoad. > > Why? This is not C++ and the namespace would be global. It's just to > have a nice grouping.
Otherwise the structure will be anonymous and those were only added to C11, not C99. > > Paolo > >> > + QEMUTimer *timer; >> > + int nr_active_ports; >> > + struct { >> > + VirtIOSerialPort *port; >> > + uint8_t host_connected; >> > + } *connected; >> > + } post_load; >> > }; >> > >> > static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, >> > uint32_t id) >> > @@ -626,6 +635,29 @@ static void virtio_serial_save(QEMUFile *f, >> > void *opaque) >> > } >> > } >> > >> > +static void virtio_serial_post_load_timer_cb(void *opaque) >> > +{ >> > + int i; >> > + VirtIOSerial *s = opaque; >> > + VirtIOSerialPort *port; >> > + uint8_t host_connected; >> > + >> > + for (i = 0 ; i < s->post_load.nr_active_ports; ++i) { >> > + port = s->post_load.connected[i].port; >> > + host_connected = s->post_load.connected[i].host_connected; >> > + if (host_connected != port->host_connected) { >> > + /* >> > + * We have to let the guest know of the host >> > connection >> > + * status change >> > + */ >> > + send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, >> > + port->host_connected); >> > + } >> > + } >> > + g_free(s->post_load.connected); >> > + s->post_load.connected = NULL; >> > +} >> > + >> > static int virtio_serial_load(QEMUFile *f, void *opaque, int >> > version_id) >> > { >> > VirtIOSerial *s = opaque; >> > @@ -673,10 +705,13 @@ static int virtio_serial_load(QEMUFile *f, >> > void *opaque, int version_id) >> > >> > qemu_get_be32s(f, &nr_active_ports); >> > >> > + s->post_load.nr_active_ports = nr_active_ports; >> > + s->post_load.connected = >> > + g_malloc0(sizeof(*s->post_load.connected) * >> > nr_active_ports); >> > + >> > /* Items in struct VirtIOSerialPort */ >> > for (i = 0; i < nr_active_ports; i++) { >> > uint32_t id; >> > - bool host_connected; >> > >> > id = qemu_get_be32(f); >> > port = find_port_by_id(s, id); >> > @@ -685,15 +720,8 @@ static int virtio_serial_load(QEMUFile *f, >> > void *opaque, int version_id) >> > } >> > >> > port->guest_connected = qemu_get_byte(f); >> > - host_connected = qemu_get_byte(f); >> > - if (host_connected != port->host_connected) { >> > - /* >> > - * We have to let the guest know of the host >> > connection >> > - * status change >> > - */ >> > - send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, >> > - port->host_connected); >> > - } >> > + s->post_load.connected[i].port = port; >> > + s->post_load.connected[i].host_connected = >> > qemu_get_byte(f); >> > >> > if (version_id > 2) { >> > uint32_t elem_popped; >> > @@ -718,6 +746,7 @@ static int virtio_serial_load(QEMUFile *f, void >> > *opaque, int version_id) >> > } >> > } >> > } >> > + qemu_mod_timer(s->post_load.timer, 1); >> > return 0; >> > } >> > >> > @@ -967,6 +996,9 @@ VirtIODevice *virtio_serial_init(DeviceState >> > *dev, virtio_serial_conf *conf) >> > register_savevm(dev, "virtio-console", -1, 3, >> > virtio_serial_save, >> > virtio_serial_load, vser); >> > >> > + vser->post_load.timer = qemu_new_timer_ns(vm_clock, >> > + virtio_serial_post_load_timer_cb, vser); >> > + >> > return vdev; >> > } >> > >> > @@ -979,6 +1011,8 @@ void virtio_serial_exit(VirtIODevice *vdev) >> > g_free(vser->ivqs); >> > g_free(vser->ovqs); >> > g_free(vser->ports_map); >> > + g_free(vser->post_load.connected); >> > + qemu_free_timer(vser->post_load.timer); >> > >> > virtio_cleanup(vdev); >> > } >> > -- >> > 1.8.0 >> > >> > >>